php通过排列组合实现1到9数字相加都等于20的方法


Posted in PHP onAugust 03, 2015

本文实例讲述了php通过排列组合实现1到9数字相加都等于20的方法。分享给大家供大家参考。具体实现方法如下:

<?php
set_time_limit(0);
/*
函数说明:huoqu_zhuhe($eq,$jiashu,$isone=0)
参数说明:$eq---几个数相加的总和;
 $jiashu-------加数数组:$jiashu=array(1,2,3,4,5,6,7,8,9),可以使用的加数;
 $isone---是否要每次使用不同的加数,唯一性,1是 0 不,默认1
返回类型:数组,数字以+相连的字符串:[0] => 3+8+9 [1] => 4+7+9
测试效果:1:对于加数数组比较小的,速度可以,过大的话,有些慢;2:每次可以使用不同的加数的,处理会变慢
采用的方法是:生成所有可能排列,对排列处理过滤重复的,得到组合
*/
function huoqu_zhuhe($eq,$jiashu,$isone=1)
{if(empty($jiashu)||!is_array($jiashu)){echo 'error:加数必须数组';return false;}
$feishu=0;
for($i=0;$i<count($jiashu);$i++){
if(!is_numeric($jiashu[$i])){$feishu=1;break;}
}
if($feishu==1){echo 'error;数组中必须是合法的数字';return false;}
$lian=$jiashu;
$savearr=array();
while(!empty($lian)){
//echo 1;
$newarr=array();
$k=0;
for($i=0;$i<count($lian);$i++){
$lianstr=$lian[$i];
$arr=explode('+',$lianstr);
$nowhe=array_sum($arr);
//echo $nowhe;
for($j=0;$j<count($jiashu);$j++){
$savestr=$lianstr.'+'.$jiashu[$j];
if($isone==1&&in_array($jiashu[$j],$arr))continue;
if(($nowhe+$jiashu[$j])>$eq)break;
else if(($nowhe+$jiashu[$j])==$eq){
$savearr[]=$savestr;
}
else{$newarr[$k]=$savestr;$k++;}
}//end for($j=0;$j<count($jiashu)
}// end for($i=0;$i
$lian=$newarr;
}//end while(!empty($lian))
//print_r($savearr);
//生成组合部分,过滤重复,2个数组以一个为参考,看另一个是否能通过移动达到匹配,可以,过滤
$isguolu=array();//存储对应的id的取舍 0取 1舍
for($i=0;$i<count($savearr);$i++){
$isguolu[]=0;
}//初始化全部0
for($i=0;$i<count($savearr);$i++){
$arr1=explode('+',$savearr[$i]);
$len1=count($arr1);
for($j=$i+1;$j<count($savearr);$j++){
$arr2=explode('+',$savearr[$j]);
$len2=count($arr2);
if($len1!=$len2)continue;
if($isguolu[$j]==1)continue;
//比较$arr1和$arr2开始
$jishu=0;
for($i1=0;$i1<count($arr1);$i1++){
$a=$arr1[$i1];
$isyou=0;
for($i2=$i1;$i2<count($arr2);$i2++){
if($a==$arr2[$i2]){
$jishu++;
$isyou=1;
$t=$arr2[$i1];
$arr2[$i1]=$arr2[$i2];
$arr2[$i2]=$t;
break;
}
}//end for($i2=0
if($isyou==0)break;
}// end for($i1=0;$i1<count($arr1);
if($jishu==$len1)$isguolu[$j]=1;
}//end for($j=$i+1;
}//end for($i=0;$i<count($savearr);$i++)
//print_r($isguolu);
//根据过滤数组选择
$newarr=array();
for($i=0;$i<count($savearr);$i++){
if($isguolu[$i]==0)$newarr[]=$savearr[$i];
}
//print_r($newarr);
return $newarr;
}
//下面是一个测试
//取用1,2,3,4,5,6,7,8,9相加所有等于20的组合
$jiashu=array(1,2,3,4,5,6,7,8,9);
$eq=20;
if($jieguo=huoqu_zhuhe($eq,$jiashu,1))print_r($jieguo);
?>

运行结果如下:

Array
(
  [0] => 3+8+9
  [1] => 4+7+9
  [2] => 5+6+9
  [3] => 5+7+8
  [4] => 1+2+8+9
  [5] => 1+3+7+9
  [6] => 1+4+6+9
  [7] => 1+4+7+8
  [8] => 1+5+6+8
  [9] => 2+3+6+9
  [10] => 2+3+7+8
  [11] => 2+4+5+9
  [12] => 2+4+6+8
  [13] => 2+5+6+7
  [14] => 3+4+5+8
  [15] => 3+4+6+7
  [16] => 1+2+3+5+9
  [17] => 1+2+3+6+8
  [18] => 1+2+4+5+8
  [19] => 1+2+4+6+7
  [20] => 1+3+4+5+7
  [21] => 2+3+4+5+6
)

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP的博客ping服务代码
Feb 04 PHP
域名和cookie问题(域名后缀)
Oct 10 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
php树型类实例
Dec 05 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
php实现插入排序
Mar 29 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
twig模板常用语句实例小结
Feb 04 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 PHP
php远程请求CURL案例(爬虫、保存登录状态)
Apr 01 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 #PHP
UTF-8正则表达式如何匹配汉字
Aug 03 #PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 #PHP
php中ob函数缓冲机制深入理解
Aug 03 #PHP
如何利用http协议发布博客园博文评论
Aug 03 #PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
Aug 01 #PHP
如何使用php实现评委评分器
Jul 31 #PHP
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
vue实现购物车的监听
2020/04/20 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
python读文件逐行处理的示例代码分享
2013/12/27 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
django框架ModelForm组件用法详解
2019/12/11 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
品牌宣传方案
2014/03/21 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书