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邮件类
Jan 03 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
php 阴历-农历-转换类代码
Jan 16 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
vue实现记事本功能
2019/06/26 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
python私有属性和方法实例分析
2015/01/15 Python
python简单实现基数排序算法
2015/05/16 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python实现快递价格查询系统
2020/03/03 Python
python实现贪吃蛇双人大战
2020/04/18 Python
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
建筑项目策划书
2014/01/13 职场文书
旷课检讨书3000字
2014/02/04 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
《观潮》教学反思
2016/02/17 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python