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 adodb连接不同数据库
Mar 19 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
yii2 上传图片的示例代码
Nov 02 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
laravel执行php artisan migrate报错的解决方法
Oct 09 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实现的封装验证码类详解
2013/06/18 PHP
用JS实现的一个include函数
2007/07/21 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
JavaScript实现自定义媒体播放器方法介绍
2017/01/03 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
python实发邮件实例详解
2019/11/11 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
python要安装在哪个盘
2020/06/15 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
python 基于opencv去除图片阴影
2021/01/26 Python
python自动生成sql语句的脚本
2021/02/24 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
上课说话检讨书大全
2014/01/22 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
交通处罚决定书
2015/06/24 职场文书
大学生受助感言
2015/08/01 职场文书
数据库连接池
2021/04/06 MySQL