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连接SQLServer2005 的问题解决方法
Jul 19 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
Sep 19 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
php简单实现sql防注入的方法
Apr 22 PHP
浅谈PHP实现大流量下抢购方案
Dec 15 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
新手学习PHP的一些基础知识分享
2011/07/27 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
ThinkPHP之getField详解
2014/06/20 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
在Python中使用元类的教程
2015/04/28 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
Python中url标签使用知识点总结
2020/01/16 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
残疾人小组计划书
2014/04/27 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL