需求:

有一个数组 ['a', 'b', 'c', 'cd']

需要从数组中取出任意 m 个不重复的元素,列出所有的可能性(也不需要出现重复的组合例如['a', 'b' ,'c'] 和 ['a', 'c', 'b'])。

可以使用递归来完成:

  1. <?php
  2.  
  3. function getCombinationToString($arr, $m) {
  4. if ($m == 1) {
  5. return $arr;
  6. }
  7. $result = [];
  8.  
  9. $tmpArr = $arr;
  10. unset($tmpArr[0]);
  11. for($i = 0; $i < count($arr); $i++) {
  12. $s = $arr[$i];
  13. $ret = getCombinationToString(array_values($tmpArr), ($m - 1), $result);
  14. foreach($ret as $row) {
  15. $val = $s . ',' . $row;
  16. $val = explode(',', $val);
  17. sort($val);
  18. $val = implode(',', $val);
  19. if(! in_array($s, explode(',', $row)) && ! in_array($val, $result)) {
  20. $result[] = $val;
  21. }
  22. }
  23. }
  24. return $result;
  25. }
  26.  
  27. $arr = ['a', 'b', 'c', 'cd'];
  28.  
  29. $t = getCombinationToString($arr, 3);
  30. echo '<pre>';print_r($t);

如果允许包含重复的组合,把 line:17 的条件注释即可。  

输出:

  1. Array
  2. (
  3. [0] => a,b,c
  4. [1] => a,b,cd
  5. [2] => a,c,cd
  6. [3] => b,c,cd
  7. )

  

方法二、

  1. <?php
  2.  
  3. $words = array('a', 'b', 'c');
  4.  
  5. $num = count($words);
  6.  
  7. $total = pow(2, $num);
  8.  
  9. for ($i = 0; $i < $total; $i++) {
  10. for ($j = 0; $j < $num; $j++) {
  11. if (pow(2, $j) & $i) echo $words[$j] . ' ';
  12. }
  13. echo '<br />';
  14. }

  

PHP 实现数学问题:组合的更多相关文章

  1. 4535 ACM 礼尚往来 数学排列组合

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4535 题意:每个礼物都不相同的组合个数 数学规律: 将每个女友排序为1···n,对应的女友送男友的礼物排序 ...

  2. 【BZOJ1008】【HNOI2008】越狱(数学排列组合题)

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3140  Solved: 1317[Submit][Status] ...

  3. hdu 4602 Partition 数学(组合-隔板法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4602 我们可以特判出n<= k的情况. 对于1<= k<n,我们可以等效为n个点排成 ...

  4. UVALive 6909 Kevin's Problem 数学排列组合

    Kevin's Problem 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid ...

  5. 排列组合的实现(js描述)

    组合的实现 排列组合描述和公式 犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的.所以排列的项数量多于组合 排列A(n,m) ...

  6. WC2019 20天训练

    Day -1 2019.1.2 初步计划: 0x60 图论 std 洛谷提高剩余练习 NOIP2018遗留题解 洛谷省选基础练习 数学: 1.数论 2.组合数学(练习:莫比乌斯反演) 3.概率(练习: ...

  7. ACM学习大纲

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

  8. ACM主要算法

    ACM主要算法ACM主要算法介绍 初期篇 一.基本算法(1)枚举(poj1753, poj2965)(2)贪心(poj1328, poj2109, poj2586)(3)递归和分治法(4)递推(5)构 ...

  9. 【设计模式】Javascript设计模式——状态模式(行为型)

    注:这个模式是非常聪明的,很有点数学中组合的意思,现在,来看下这个模式是怎么个思想. 问题提出:假如某个操作有三种可能,分别为1,2,3,还可能是组合,比如先执行1,再执行2或者先执行2再执行3或者1 ...

  10. [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具

    作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...

随机推荐

  1. connect 链接失败: 查找不到 signal

                提示错误是:   signal_index < 0 ;;     ----  故 connect返回false;              消除  connect  信号 ...

  2. 在测试框架中使用Log4J 2

    之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...

  3. POJ 2337 Catenyms(有向图的欧拉通路)

    题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...

  4. 16进制ascii码转化为对应的字符,付ipmitool查询硬件信息

    最近工作需要在用ipmitool查询服务器硬件信息.ipmitool查询硬件信息 比如电源,使用命令: 获取PSU0信息:Ipmitool raw 0x3a 0x71 0x00: 获取PSU1信息:I ...

  5. hyperV中修改centos分辨率

    grubby --update-kernel=ALL --args="video=hyperv_fb:1366x768"

  6. resultMap 映射

    1. sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段. <sql id="personColumns"> name, sex, updateTime& ...

  7. VR技术的探索阶段

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 早在1929年,在长期使用教练机训练器(机翼变短,不能产生离开地面所需的足够提升力)进行飞行训练之后,E ...

  8. 与你相遇好幸运,服务器node环境安装

    >服务器更改root密码 sudo passwd root >服务器ubuntu安装ssh apt-get install openssh-server >服务器开启root用户密码 ...

  9. [JAVA] BlockingQueue学习

    有点时间,巩固巩固下基础知识:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤 ...

  10. Build2016上值得一看的大数据相关Session

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:Build2016开完很久了,现在才来回顾下,就说说那些和大数据相关的Session, ...