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防CC攻击实现代码
Dec 29 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
PHP的基本常识小结
Jul 05 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP里的单例类写法实例
Jun 25 PHP
yii分页组件用法实例分析
Dec 28 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
php传值和传引用的区别点总结
Nov 19 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
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
CI框架中zip类应用示例
2014/06/17 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
jquery.combobox中文api和例子,修复了上面的小bug
2011/03/28 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python中的自定义函数学习笔记
2014/09/23 Python
用Python解决x的n次方问题
2019/02/08 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
iostream与iostream.h的区别
2015/01/16 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
六十岁生日答谢词
2014/01/10 职场文书
学徒工职责
2014/03/06 职场文书
大学毕业感言200字
2014/03/09 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
运动会通讯稿200字
2015/07/20 职场文书
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang