这个问题也比较常见,网上方法也很多。 这里也是用数组的方法来完成。用到了集合、子集的思想。注释中详细说明了。

从m个数中选出n个数来 ( 0 < n <= m), 要求n个数之间不能有重复,其和等于一个定值k, 求一段程序,罗列所有的可能。

如从 [11, 18, 12, 1, -2, 20, 8, 10, 7, 6] 中取出之和为18的集合,如[11,7][18]等。

<?php
header('Content-type: text/html; charset=utf-8');
/**
* 从m个数中选出n个数来 ( 0 < n <= m), 要求n个数之间不能有重复,其和等于一个定值k, 求一段程序,罗列所有的可能。
* @param int   $need 定值
* @param array $arr  选取的数组集合
* @return array      符合的子集合
*/
function sel_set($need, $arr) {    //子集数2的数组元素数次方$arr_count = count($arr);$set_count = pow(2, $arr_count);/*** 此方法原理: 对于集合{a, b, c}* 针对其中的元素都有2种状态1在子集中0不在* 0=>0 0 0 空集不需要考虑* 1=>0 0 1 => c * 2=>0 1 0 => b* 3=>0 1 1 => b c* 4=>1 0 0 => a* 5=>1 0 1 => a c* 6=>1 1 0 => a b* 7=>1 1 1 => a b c * 也就是将每个子集对应的编号转化为二进制 再去数组取对应元素*///set_arr用来存放符合需求的子集$set_arr = array();//set_count个子集,所以循环set_count次for( $i = 1; $i < $set_count; $i++ ) {//tmp用来存放每次子集 $tmp = array();//将子集对应编号转化二进制$dec = decbin($i);//数组集合有arr_count个元素,所以将二进制左补0为对应位,以便取数组元素$dec = str_pad($dec, $arr_count, 0, STR_PAD_LEFT);//对该二进制数循环 判断是否为1for( $j = 0; $j < $arr_count; $j++ ) {//如果当前位为1, 则将数组对应元素放入子集数组if( 1 == $dec[$j] ) {array_push($tmp, $arr[$j]);}}//判断当前子集之和是否等于设定的定值,符合则存入set_arrif( $need == array_sum($tmp) ) {array_push($set_arr, json_encode($tmp));}}//返回符合要求的集合return $set_arr;
}
//要进行选取的数组,及定值
$need = 18;
$arr = array(11, 18, 12, 1, -2, 20, 8, 10, 7, 6);sel_set($need, $arr);

从多个数中取出之和等于定值的组合相关推荐

  1. Java 列举数组中任意元素和为定值的组合

    import java.util.Arrays;/*** 列举数组中任意元素和为定值的组合*/ public class SolveProb {// Arrays.sort(arr);static i ...

  2. 从n个不同元素中取出m个元素排列组合

    01. 问题 问题01. 算法: 从n个不同元素中取出m个元素的排列数是多少? 这些排列分别是什么? (其中: n > 0; 0 < m ≤ n;) 问题02. 算法: 从n个不同元素中取 ...

  3. 从数组中取出n个元素的所有组合(递归实现)

    今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的问题,如求从n个数组任意选取一个元素的所有组合都是想起来比较简单,但是设计成算法却颇费周折. 如数组为{1, 2, 3, 4, ...

  4. python取列表前几个元素_Python下几种从一个序列中取出元素的方法

    使用Python进行数据处理时,有时候会有这样的操作,比如从一个列表或者numpy array中随机取出一个元素,对一个列表中的元素进行shuffle,等等.虽然这些操作也可以通过编写很简短的程序完成 ...

  5. c语言while输入n求n个奇数,任意输入n个整数,输出这n个数中的奇数个数和偶数个数.用while语句...

    C语言 输入n并输入n个数,输出这n个数中的所有奇数的乘积 #includevoidmain(){inti,n,arr[100],mul=1;printf("请输入n值:");sc ...

  6. 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值

    我觉得写得很清晰,希望没有侵犯作者的著作权,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一个数组中的两个数字,让这 ...

  7. 两个数之和等于第三个数

          这是一个很好的算法题,解法类似于快速排序的整理方法.同时,更为值得注意的是这道题是 人人网2014校园招聘的笔试题,下面首先对题目进行描述:       给出一个有序数组,另外给出第三个数 ...

  8. 查找数组中两两之和等于X的整数对(C语言实现)

    王道数据结构线性章节的思维拓展 一个长度为N的整形数组A[1-N],给定整数X,设计一个时间复杂度不超过O(nlog2^n)的算法,查找数组中所有两两之和等于X的整数对(每个元素只输出一次) 书上有可 ...

  9. 算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m

    转载请注明原文出处:http://blog.csdn.net/baidu_37107022/article/details/75125846 Q题目 编程求解 输入两个整数 n 和 m,从数列1,2, ...

最新文章

  1. GMPC:一个 MPD 客户端
  2. svpwm矢量控制电机相电压波形_【顺藤摸瓜】永磁同步为什么要用SVPWM控制
  3. 自学python能干些什么副业-揭秘!女程序员为啥更赚钱?这4个大招,用Python做副业躺赚...
  4. ITU-T G.1081 IPTV性能监测点 (Performance monitoring points for IPTV)
  5. [Error]Python虚拟环境报错 OSError: setuptools pip wheel failed with error code 2
  6. Java调用R与Python
  7. 共226款Html5小游戏源码分享
  8. chap10 图像分割(数字图像处理/冈萨雷斯)
  9. linux 内核入口地址,Linux内核程序入口地址
  10. ios 融云 重写对话列表_iOS消息体系架构详解-融云即时通讯云
  11. 教学服务系统设计之PHP后台设计
  12. 轻松玩转Linux之撩妹神器一一Shell脚本
  13. 1010: 求圆的周长和面积 ZZULIOJ
  14. 我们且请仁兄到敝庄 水浒
  15. 神经网络neural network
  16. Vue.js入门指南(一)
  17. HTML服务器发送事件
  18. 飞机飞行动力学与控制仿真
  19. node中的global对象
  20. 找零问题——贪心算法

热门文章

  1. GDAL ogr2ogr 转换mif 为sqlite
  2. 视频教程-大数据搜索技术-大数据
  3. 图像超分辨重构(SR)论文整理————适用于刚接触这个领域的初级研究者。(持续更新)
  4. 安装pycrypto
  5. backtrack5网络设置
  6. xinetd 服务
  7. prompt tuning
  8. MATLAB处理EXCEL文件
  9. IEEE论文搜索方法
  10. Anaconda安装使用