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 相关文章推荐
mysql 全文搜索 技巧
Apr 27 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
php构造函数与析构函数
Apr 23 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 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
thinkphp实现图片上传功能分享
2014/03/04 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP防盗链代码实例
2014/08/27 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
js密码强度校验
2015/11/10 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
python自带的http模块详解
2016/11/06 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python正则表达式实例代码
2020/03/03 Python
Python流程控制语句的深入讲解
2020/06/15 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
给导游的表扬信
2014/01/10 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
经典禁毒标语
2014/06/16 职场文书
寒山寺导游词
2015/02/03 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
预备党员半年考察意见
2015/06/01 职场文书
宾馆安全管理制度
2015/08/06 职场文书
2016年主题党日活动总结
2016/04/05 职场文书