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中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php递归删除目录与文件的方法
Jan 30 PHP
Redis构建分布式锁
Mar 28 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
PHP设计模式之装饰器模式定义与用法详解
Apr 02 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 PHP
详解PHP设计模式之依赖注入模式
May 25 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
德生1994机评
2021/03/02 无线电
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
php session_decode函数用法讲解
2019/05/26 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
js实时监听文本框状态的方法
2011/04/26 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
内容编辑个人求职信
2013/12/10 职场文书
中华魂演讲稿
2014/05/13 职场文书
幼儿园运动会口号
2014/06/07 职场文书
运动会广播稿200字
2014/10/18 职场文书
实习生个人总结范文
2015/02/28 职场文书
护士自荐信怎么写
2015/03/06 职场文书
目标责任书格式范文
2015/05/11 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python