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之第十天
Oct 09 PHP
PHP获取文件后缀名的三个函数
Oct 15 PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 PHP
php ios推送(代码)
Jul 01 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
golang 调用 php7详解及实例
Jan 04 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
php输出反斜杠的实例方法
Sep 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
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
理解javascript async的用法
2017/08/22 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python中itertools模块用法详解
2014/09/25 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
python打开文件的方式有哪些
2020/06/29 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
python操作toml文件的示例代码
2020/11/27 Python
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
某公司部分笔试题
2013/11/05 面试题
建筑公司文秘岗位职责
2013/11/29 职场文书
关于爱情的广播稿
2014/01/16 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
教师党员自我评价2015
2015/03/04 职场文书