PHP 实现数学问题:组合

需求:

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

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

可以使用递归来完成:

<?php

function getCombinationToString($arr, $m) {
	if ($m == 1) {
	   return $arr;
	}
	$result = [];

	$tmpArr = $arr;
	unset($tmpArr[0]);
	for($i = 0; $i < count($arr); $i++) {
		$s = $arr[$i];
		$ret = getCombinationToString(array_values($tmpArr), ($m - 1), $result);
		foreach($ret as $row) {
			$val = $s . ‘,‘ . $row;
			$val = explode(‘,‘, $val);
			sort($val);
			$val = implode(‘,‘, $val);
			if(! in_array($s, explode(‘,‘, $row)) && ! in_array($val, $result)) {
				$result[] = $val;
			}
		}
	}
  return $result;
}

$arr = [‘a‘, ‘b‘, ‘c‘, ‘cd‘];

$t = getCombinationToString($arr, 3);
echo ‘<pre>‘;print_r($t);

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

输出:

Array
(
    [0] => a,b,c
    [1] => a,b,cd
    [2] => a,c,cd
    [3] => b,c,cd
)

  

时间: 2024-10-29 13:07:14

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

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

数学竞赛 组合类问题(1)

在单位正方形周界上的两个点连接一条直线,如果这条直线把正方形分成面积相等的两部分,试证该直线长度不小于1 证明:该题非常简单.先证明这条直线必然过正方形中心点O: 假设1线不过中心点O且分成面积相等的两部分,过O作平行于1的直线2,易知2将正方形分成S=的两部分,所以1肯定没把正方形分成S=的两部分,与假设矛盾,所以这条直线必然过正方形中心点O.而过O点且两端点在正方形周界上的线段的长度不小于一,所以命题得证. 原文地址:https://www.cnblogs.com/lau1997/p/125

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

HDU 2068 RPG的错排(排列组合,错排)非常详细~

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068 这道题需要用到错排公式以及高中数学排列组合的知识. 排列组合:[1]排列(从n中拿出m个,并进行排列):A_n_m=n!/(n-m)!=n*(n-1)*(n-2)*........(n-m+1); [2]组合(从n中拿出m个,不进行排列):C_n_m=n!/((n-m)!*m!)=n*(n-1)*(n-2)*........(n-m+1)/(m*(m-1)*.......1); 因此不难得出排

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

组合的实现 排列组合描述和公式 犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的.所以排列的项数量多于组合 排列A(n,m)=n×(n-1).(n-m+1)=n!/(n-m)!(n为下标,m为上标,以下同) 组合C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)! 组合的实现 /** * 求:组合C(m, n),m为上标,n为下标.m选n的所有项 * m {必传} 原始数据 * n {必传} 当前项还需元素

康托展开

对于n个数的全排列,共有n!中排列方式,如何求某一个序列在整个排列中的次序(从小到大)? 以9的全排列举例:842697513是1-9全排列的第几个?(高中数学排列组合问题,只需要做到不重不漏) 首先看第一位为8,那么第一位为1-7的全排列都比它小,共有7*8!个. 在第一位为8的情况下,其次看第二位为4,那么第二位为1-3的全排列都比它小,共有1*3*7!个. 在第一位为8,第二位为4的情况下,那么第三位为1的全排列都比它小,共有1*1*6!个. 在第一位为8,第二位为4,第三位为2的情况下,

6月26日 cf总结

6月26日 cf总结 今天写到一半就去水群了..又浪费了一次冲紫的机会..今天的C题很简单的..可惜只顾着水群,题意没看清楚就写了...另外AB题的手速还是太慢,B题应该是傻逼一眼题却花了20min,C题题意没看清楚就去水群了,高中的排列组合送分题啊... A题:水题,不能在5分钟之内看完题目并AC就是慢,当然这次是受网速影响了. B题:水题,求翻转列使行的所有数为1的行数的最大值.不管怎么翻转,状态相同的行改变后的状态都是相同的,只要找出状态相同的行的最大个数就可以了,把状态相同的行全部翻转成

游戏迷雾算法-高效

博文背景 今年我们公司要做一款即时战略MOBA游戏,MOBA的游戏对性能的要求特别大,所以算法的性能是关键.我们开发这款游戏之前面临着三大技术难点,一个是美术方面,一个是寻路算法(障碍物时时发生变化),别一个就是迷雾算法(必须高效).战争迷雾除了客户端要表现出来之外,服务器也要计算,因为服务器要计算那此敌人是你能看见的,能看见才会发它的数据给你.如果服务器不计算,很容易作假,比如CF游戏中,由利用外挂可以穿墙看到敌人.这是因为服务器没有计算,把所有敌人的数据都下发给了客户端,客户端根据障碍物计算

ACM训练大纲

1. 算法总结及推荐题目 1.1 C++ STL ? STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset? STL算法: sort, unique, nth_element, reverse, rotate, next_permution, find, for_each, count, lower_bound, max, swap, random_shuffle 1.2 基本算法 ? 枚举: poj1753,

编程进阶(转载)

ACM算法列表 ACM所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列双端队列可并堆左偏堆 二叉查找树Treap伸展树 并查集集合计数问题二分图的识别 平衡二叉树 二叉排序树 线段树一维线段树二维线段树 树状数组一维树状数组N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树.动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分量Tarjan算法双连通分量强连通分支及其