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 目录与文件处理-郑阿奇(续)
Jul 04 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
CI框架中zip类应用示例
Jun 17 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
PHP中使用array函数新建一个数组
Nov 19 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
ThinkPHP框架表单验证操作方法
Jul 19 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
php的无刷新操作实现方法分析
Feb 28 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
截获网站title标签之家内容的例子
2006/10/09 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php基础学习之变量的使用
2011/06/09 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
php实现的CSS更新类实例
2014/09/22 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
JS+CSS实现过渡特效
2021/01/02 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
Python实现针对中文排序的方法
2017/05/09 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python SQLite3简介
2018/02/22 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
PHP笔试题
2012/02/22 面试题
在职人员函授期间自我评价分享
2013/11/08 职场文书
银行进社区活动总结
2014/07/07 职场文书
六一儿童节活动总结
2014/08/27 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
模范班主任事迹材料
2014/12/17 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python