PHP中简单实现数学组合算法

公式

有时候也表示成:

c(n,m)=p(n,m)/m!=n!/((n-m)!*m!)

2性质

c(n,m)=c(n,n-m);

3递推公式

c(n,m)=c(n-1,m-1)+c(n-1,m)

等式左边表示从n个元素中选取m个元素,而等式右边表示这一个过程的另一种实现方法:任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的分成两类情况,即m个被选择元素包含了特殊元素和m个被选择元素不包含该特殊元素。

 代码如下 复制代码

<?php
//实现数学上的组合数算法
header("content-type:text/html;charset=utf-8");
/**
 * 在数组$a中任意m个元素组合
 *
 * @param array $a 候选的集合
 * @param int $n 候选的集合大小
 * @param int $m 组合元素大小
 * @param array $b 储存当前组合中的元素,这里储存的是元素键值
 * @param int $M 相当一个常量,一直保持不变
 * @return */
function combine($a,$n,$m,$b,$M){
 for($i=$n;$i>=$m;$i--){
  $b[$m-1]=$i-1;
  if($m > 1){
   $combine[]=combine($a,$i-1,$m-1,$b,$M);
  }else{
   $onecombine='';
   for($j=$M-1;$j>=0;$j--){
    $onecombine.=$a[$b[$j]];
   }
   $combine[]=$onecombine;
   $onecombine='';
  }
 }
 return $combine;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数*/
function recursionarray($arr){
 $i=0;
 foreach($arr as $value){
  if(is_array($value)){
   $i+=recursionarray($value);
  }else{
   echo $value."<br/>";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D','E','F','G','H','I','J');
$b=array();
$combine=combine($a,10,5,$b,5);
$count=recursionarray($combine);
echo "总共有".$count."组合";
?>

时间: 2024-08-04 10:07:13

PHP中简单实现数学组合算法的相关文章

Flash中简单跟踪弹的算法

算法 我看到的一些作跟踪弹的方法,都是要用向限的转换,还要考虑子弹和飞机在某个方向保持平行时做一些调整,个人认为有些烦.而我这个用方向向量来计算跟踪弹的方式,无论坐标系如何变,相关的计算只有一个,把速度在X,Y方向的"单位方向向量"计算出来,即可. 学过向量的朋友应该都知道,单位方向向量(x,y),其中的X就是这个向量与X轴的夹角的余弦值,而Y就是正弦值,还等什么,马上行动. 核心代码如下:  function Getdistance(mc1, mc2) {//计算了出二者---子弹与

《趣题学算法》—第1章1.2节简单的数学计算

1.2 简单的数学计算以上那样利用循环重复将部分数据简单地累加,可以解决很多计数问题.然而,如果计数问题可以通过数学计算直接得出结果,往往可以大大改善算法的时间效率,请看下列问题. 问题1-5 小小度刷礼品图片 7 问题描述 一年一度的百度之星大赛又开始了,这次参赛人数创下了吉尼斯世界纪录.于是,百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份. 小小度同学非常想得到这份礼品,于是他就连续提交了很多次,提交的ID从a连续到b.他想知道能得到多少份礼品,你能帮帮他吗

数据科学中的非数学特征工程技术

◆ ◆ ◆ 导 读 "应用机器学习像是把你当一个伟大的工程师,而非伟大的机器学习专家." 这是我在一份谷歌内部文件中读到的如何应用机器学习的第一句话.的确如此.以我作为服务器工程师/数据分析师的有限经验,数据(以及如何存储/处理)一直都是所有问题的核心,在整体中举足轻重.去问问任何一位Kaggle的获胜者,他们都会说,最大的收获总是来源于聪明地表示数据,而不是使用某些复杂的算法.即使CRISP数据挖掘处理也使用了不是一个,而是两个阶段,专门用来理解和准备数据. ◆ ◆ ◆ 特征工程 那

蛙蛙推荐:asp中的多条件组合查询实现

条件|组合查询 <!-- 蛙蛙推荐:asp中的多条件组合查询实现多条件组合查询在很多地方都很有用,本文用一个简单的例子来实现一种组合查询在示例之前请确保你安装有sqlserver2000及其默认数据库NorhtWind.代码非常直观,加上关键部分我做了注释,所以很容易理解.需要注意的几个问题就是:1.在字符串连接的时候注意两个需要连接的串中第二个串的开头第一个字符应该打一个空格,这样不至于两个串的首尾相连成一个单词.2.righ的left函数取出的结构区分大小写,如果你字符串里用的是'and',

Java实现全排列、组合算法

全排列 解法一: 输入一串字符,然后对字符进行全排列,如"abc",全排列结果为:"abc","acb","bac","bca","cab","cba". 分析:从字符串中选择一个作为第一个字符,然后对剩下的字符串进行全排列,如此递归下去,直到打印出全部排列.如:"abc": 1.选a作为第一个字符:"abc","ac

字符串的组合算法问题的C语言实现攻略_C 语言

基本字符串组合问题 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 上面我们详细讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. 假设我们想在长度为n的字符串中求m个字符的组合.我们先从头扫描字符串的第一个字符.针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符:第二是不把这个字符放到组合中去,接下来我们需要在剩下的n

Python中使用hashlib模块处理算法的教程

  这篇文章主要介绍了Python中使用hashlib模块处理算法的教程,代码基于Python2.x版本,需要的朋友可以参考下 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d7

排列组合算法

    排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列:从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示. A(n,m)=n(n-1)(n-2)--(n-m+1)= n!/(n-m)! 此外规定0!=1     组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合:从n个不同元素中取出m(m<=

退火算法-java最优组合算法问题,编程实现字母最优组合生成最优解

问题描述 java最优组合算法问题,编程实现字母最优组合生成最优解 要求:输入A~K中的任意几个字母(无重复),对这些字母进行组合.输出最优组合的最小组数n和组合方案,使用java语言. 约束条件:A可以和B一组: A可以和E.F.G一组: C.D.H要单独分组: I可以和E.F.G一组: J可以和E.F.G一组: K可以和E.F.G一组: 如果可以,希望用退火算法的思想来解决本问题.毕设赶着要用这个算法,希望尽快提供解决方案,拜谢! 解决方案 两两组合,还是可以多个组合? 解决方案二: 必须是