当前位置:首页 » 操作系统 » 组合算法教程

组合算法教程

发布时间: 2023-08-24 18:24:22

⑴ 排列组合公式及排列组合算法

排列组合公式

排列组合公式/排列组合计算公式

公式P是指排列,从N个元素取M个进行排列。

公式C是指组合,从N个元素取M个进行组合,不进行排列。

N-元素的总个数

M参与选择的元素个数

!-阶乘,如9!=9*8*7*6*5*4*3*2*1

从N到数M个,表达式应该为n*(n-1)*(n-2)..(n-m+1);

因为从n到(n-m+1)个数为n-(n-m+1)=m

举例:

Q1: 有从1到9共计9个号码球,请问,可以组成多少个三位数?

A1: 123和213是两个不同的排列数。即对排列顺序有要求的,既属于“排列P”计算范畴。

上问题中,任何一个号码只能用一次,显然不会出现988,997之类的组合,我们可以这么看,百位数有9种可能,十位数则应该有9-1种可能,个位数则应该只有9-1-1种可能,最终共有9*8*7个三位数。计算公式=P(3,9)=9*8*7,(从9倒数3个的乘积)

Q2:有从1到9共计9个号码球,请问,如果三个一组,代表“三国联盟”,可以组合成多少个“三国联盟”?

A2:213组合和312组合,代表同一个组合,只要有三个号码球在一起即可。即不要求顺序的,属于“组合C”计算范畴。

上问题中,将所有的包括排列数的个数去除掉属于重复的个数即为最终组合数C(3,9)=9*8*7/3*2*1

⑵ 排列组合中A和C怎么算啊

1、排列组合中,组合的计算公式为:

⑶ 组合数公式的算法举例

1、设15000件产品中有1000件次品,从中拿出150件,求得到次品数的期望和方差?
2、设某射手对同一目标射击,直到射中R次为止,记X为使用的射击次数,已知命中率为P,求E(X)、D(X)。
这两题都要用到一些技巧。我先列出几个重要公式,证明过程中提供变换技巧,然后把这两个题目作为例题。
先定义一个符号,用S(K=1,N)F(K)表示函数F(K)从K=1到K=N求和。
公式1:
C(M-1,N-1)+C(M-1,N)=C(M,N)
公式1 证明:
方法1、可直接利用组合数的公式证明。
方法2、(更重要的思路)。
从M个元素中任意指定一个元素。则选出N个的方法中,包含这一个元素的有C(M-1,N-1)种组合,不包含这一个元素的有C(M-1,N)种组合。
因此,C(M-1,N-1)+C(M-1,N)=C(M,N)
公式2:
S(K=N,M)C(K-1,N-1)=C(M,N) (M》=N)
证明:C(M,N)是从M个物品中任选N个的方法。
从M个物品中任意指定M-N个,并按次序编号为第1到第M-N号,而其余的还有N个。
则选出N个的方法可分类为:
包含1号的有C(M-1,N-1)种;
不包含1号,但包含2号的有C(M-2,N-1)种;
。。。。。。
不包含1到M-K号,但包含M-K+1号的有C(K-1,N-1)种
。。。。。。
不包含1到M-N-1号,但包含M-N号的有C(N,N-1)种不包含1到M-N号的有C(N,N)种,而C(N,N)=C(N-1,N-1)
由于两种思路都是从M个物品中任选N个的方法,因此
S(K=N,M)C(K-1,N-1)=C(M,N)
公式3:
S(K=0,N)C(P,K)*C(Q,N-K)=C(P+Q,N) (P,Q)=N)
证明:一批产品包含P件正品和Q件次品,则从这批产品中任选N件的选法为C(P+Q,N)。而公式里面的K表示选法中正品数量,
C(P,K)*C(Q,N-K)表示N件产品中有K件正品,N-K件次品的选法。K从0到N变化时,就包含了所有不同正品、次品数的组合。
因此,S(K=0,N)C(P,K)*C(Q,N-K)=C(P+Q,N)
公式4(一种变换技巧):
S(K=0,N)K*C(M,K)=S(K=0,N-1)M*C(M-1,K)
证明:
S(K=0,N)K*C(M,K)
=S(K=1,N)K*C(M,K)
=S(K=1,N)K*M!/K!/(M-K)!
=S(K=1,N)M*(M-1)!/(K-1)!/(M-K)!
=S(K=1,N)M*C(M-1,K-1)
=S(K=0,N-1)M*C(M-1,K)
公式5(公式4的同种)
S(K=0,N)K*(K-1)*C(M,K)
=S(K=0,N-2)M*(M-1)*C(M-2,K)
证明:(类似上式)
S(K=0,N)K*(K-1)*C(M,K)
=S(K=2,N)K*(K-1)*M!/K!/(M-K)!
=S(K=2,N)M*(M-1)*(M-2)!/(K-2)!/(M-K)!
=S(K=2,N)M*(M-1)*C(M-2,K-2)
=S(K=0,N-2)M*(M-1)*C(M-2,K)
公式4用于求数学期望,公式4、公式5结合起来可用于求方差。
例1、设15000件产品中有1000件次品,从中拿出150件,求得到次品数的期望和方差?
解:(本题利用公式3、4、5)
有K件次品的概率为:
P(K)=C(1000,K)*C(14000,150-K)/C(15000,150)
E(X)
=S(K=0,150)K*C(1000,K)*C(14000,150-K)/C(15000,150)
=S(K=0,149)1000*C(999,K)*(14000,149-K)/C(15000,150)
=1000*C(14999,149)/C(15000,150)
=10
D(X)
=S(K=0,150)(K-10)*(K-10)*C(1000,K)*C(14000,150-K)/C(15000,150)
=S(K=0,150)(K*K-K-19*K+100)*C(1000,K)*C(14000,150-K)/C(15000,150)
=S(K=0,150)K*(K-1)*C(1000,K)*C(14000,150-K)/C(15000,150)
-19*S(K=0,150)K*C(1000,K)*C(14000,150-K)/C(15000,150)
+100*S(K=0,150)C(1000,K)*C(14000,150-K)/C(15000,150)
=S(K=0,148)1000*999*C(998,K)*C(14000,148-K)/C(15000,150)
-19*S(K=0,149)*1000*C(999,K)*C(14000,149-K)/C(15000,150)
+100*S(K=0,150)C(1000,K)*C(14000,150-K)/C(15000,150)
=1000*999*C(14998,148)/C(15000,150)
-19*1000*C(14999,149)/C(15000,150)+100
=138600/14999
=9.240616041
此题推广形式为:
设M件产品中有P件次品,从中拿出N件(N《=P),求得到次品数的期望和方差?
E(X)=P*N/M
D(X)=P*(P-1)*C(M-2,N-2)/C(M,N)
+(1-2*P*N/M)*P*C(M-2,N-2)/C(M,N)+(P*N/M)^2
例2、设某射手对同一目标射击,直到射中R次为止,记X为使用的射击次数,已知命中率为P,求E(X)、D(X)。
解:射中R次,使用的射击次数为K次(K>=R),则前K-1次射中R-1次,第K次射中了,概率为:
P(K)=C(K-1,R-1)*P^R*(1-P)^(K-R)
(以下暂时用W表示无穷大)
射中R次,使用的射击次数可为R次、R+1次...W次
因此S(K=R,W)P(K)=1 (这是概率的特点)
即:S(K=R,W)C(K-1,R-1)*P^R*(1-P)^(K-R)=1
以上证明的式子是另一个公式,即无论P,R是什么数都成立,以下将应用这一公式。
E(X)
=S(K=R,W)K*C(K-1,R-1)*P^R*(1-P)^(K-R)
=S(K=R,W)K*(K-1)!/(R-1)!/(K-R)!*P^R*(1-P)^(K-R)
=S(K=R,W)R*K!/R!/(K-R)!*P^R*(1-P)^(K-R)
=S(K=R,W)R*C(K,R)*P^R*(1-P)^(K-R)
=R/P*S(K=R,W)C(K,R)*P^(R+1)*(1-P)^(K-R)
令K1=K+1,R1=R+1,则
E(X)=R/P*S(K1=R1,W)C(K1-1,R1-1)*P^R1*(1-P)^(K1-R1)
利用以上公式得
E(X)=P/R
D(X)
=S(K=R,W)(K-R/P)^2*C(K-1,R-1)*P^R*(1-P)^(K-R)
=S(K=R,W)(K*K-2*K*R/P+R*R/P/P)*C(K-1,R-1)*P^R*(1-P)^(K-R)
=S(K=R,W)[K*(K+1)-(K+2*K*R/P)+R*R/P/P]*C(K-1,R-1)*P^R*(1-P)^(K-R)
=S(K=R,W)[K*(K+1)*C(K-1,R-1)*P^R*(1-P)^(K-R)
-S(K=R,W)(K+2*K*R/P)*C(K-1,R-1)*P^R*(1-P)^(K-R)
+S(K=R,W)R*R/P/P*C(K-1,R-1)*P^R*(1-P)^(K-R)
=(推导过程同求E(X),略)
=R(R+1)/P/P-(2*R+P)*R/P/P+R*R/P/P
=(1-P)*R/P/P

⑷ 排列组合中A和C的算法怎么算的,查了百度都不会,求详细点的谢谢(高中)

排列数 A(n,m) ----------即 字母A右下角n 右上角m,表示n取m的排列数
A(n,m)=n!/(n-m)!=n*(n-1)*(n-2)*……*(n-m+1)
A(n,m)等于从n 开始连续递减的 m 个自然数的积
n取m的排列数 A(n,m) 等于从n 开始连续递减的 m 个自然数的积
例: A(7,3)=7*6*5=210
组合数 C(n,m) ----------即 字母C右下角n 右上角m,表示n取m的排列数
C(n,m)=n!/(m!*(n-m)!)=n*(n-1)*(n-2)*……*(n-m+1)/(1*2*3*……*m)
C(n,m)等于(从n 开始连续递减的 m 个自然数的积)除以(从1开始连续递增的 m 个自然数的积)
n选m的组合数 C(n,m) 等于(从n 开始连续递减的 m 个自然数的积)除以(从1开始连续递增的 m 个自然数的积)
例: C(7,3)=7*6*5/(1*2*3)=35

⑸ 关于各种排列组合java算法实现方法

一 利用二进制状态法求排列组合 此种方法比较容易懂 但是运行喊隐颂效率不高 小数据排列组合可以使用

复制代码 代码如下: import java util Arrays;

//利用二进制算法进行全排列 //count : //count :

public class test { public static void main(String[] args) { long start=System currentTimeMillis(); count (); long end=System currentTimeMillis(); System out println(end start); } private static void count (){ int[] num=new int []{ }; for(int i= ;i<Math pow( );i++){ String str=Integer toString(i ); int sz=str length(); for(int j= ;j< sz;j++){ str=" "+str; } char[] temp=str toCharArray(); Arrays sort(temp); String gl=new String(temp); if(!gl equals(" ")){ continue; } String result=""; for(int m= ;m<str length();m++){ result+=num[Integer parseInt(str charAt(m)+"")]; } System out println(result); } } public static void count (){ int[] num=new int []{ }; int[] ss=new int []{ }; int[] temp=new int[ ]; while(temp[ ]< ){ temp[temp length ]++; for(int i=temp length ;i> ;i ){ if(temp[i]== ){ temp[i]= ; temp[i ]++; } } int []tt=temp clone(); Arrays sort(tt); if(!Arrays equals(tt ss)){ continue; } String result=""; for(int i= ;i<num length;i++){ result+=num[temp[i]]; } System out println(result); } } }

二 用递归的思想携慧来求排列跟组合 代码量比较大

复制代码 代码如下郑郑: package practice;

import java util ArrayList; import java util List;

public class Test {

/** * @param args */ public static void main(String[] args) { // TODO Auto generated method stub Object[] tmp={ }; // ArrayList<Object[]> rs=RandomC(tmp); ArrayList<Object[]> rs=cmn(tmp ); for(int i= ;i<rs size();i++) { // System out print(i+"="); for(int j= ;j<rs get(i) length;j++) { System out print(rs get(i)[j]+" "); } System out println(); } }

// 求一个数组的任意组合 static ArrayList<Object[]> RandomC(Object[] source) { ArrayList<Object[]> result=new ArrayList<Object[]>(); if(source length== ) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) { psource[i]=source[i]; } result=RandomC(psource); int len=result size();//fn组合的长度 result add((new Object[]{source[source length ]})); for(int i= ;i<len;i++) { Object[] tmp=new Object[result get(i) length+ ]; for(int j= ;j<tmp length ;j++) { tmp[j]=result get(i)[j]; } tmp[tmp length ]=source[source length ]; result add(tmp); } } return result; } static ArrayList<Object[]> cmn(Object[] source int n) { ArrayList<Object[]> result=new ArrayList<Object[]>(); if(n== ) { for(int i= ;i<source length;i++) { result add(new Object[]{source[i]}); } } else if(source length==n) { result add(source); } else { Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) { psource[i]=source[i]; } result=cmn(psource n); ArrayList<Object[]> tmp=cmn(psource n ); for(int i= ;i<tmp size();i++) { Object[] rs=new Object[n]; for(int j= ;j<n ;j++) { rs[j]=tmp get(i)[j]; } rs[n ]=source[source length ]; result add(rs); } } return result; }

}

三 利用动态规划的思想求排列和组合

复制代码 代码如下: package Acm; //强大的求组合数 public class MainApp { public static void main(String[] args) { int[] num=new int[]{ }; String str=""; //求 个数的组合个数 // count( str num ); // 求 n个数的组合个数 count ( str num); }

private static void count (int i String str int[] num) { if(i==num length){ System out println(str); return; } count (i+ str num); count (i+ str+num[i]+" " num); }

private static void count(int i String str int[] num int n) { if(n== ){ System out println(str); return; } if(i==num length){ return; } count(i+ str+num[i]+" " num n ); count(i+ str num n); } }

下面是求排列

复制代码 代码如下: lishixin/Article/program/Java/JSP/201311/20148

⑹ 组合计算公式

组合数的计算公式为:

组合是数学的重要概念之一,它表示从 n 个不同元素中每次取出 m 个不同元素,不管其顺序合成一组,称为从 n 个元素中不重复地选取 m 个元素的一个组合。所有这样的组合的种数称为组合数。

n 元集合 A 中不重复地抽取 m 个元素作成的一个组合实质上是 A 的一个 m 元子集和。如果给集 A 编序成为一个序集,那么 A 中抽取 m 个元素的一个组合对应于数段到序集 A 的一个确定的严格保序映射。

(6)组合算法教程扩展阅读

组合数的性质:

1、互补性质:即从n个不同元素中取出m个元素的组合数=从n个不同元素中取出 (n-m) 个元素的组合数;这个性质很容易理解,例如C(9,2)=C(9,7),即从9个元素里选择2个元素的方法与从9个元素里选择7个元素的方法是相等的。

2、组合恒等式:若表示在 n 个物品中选取 m 个物品,则如存在下述公式:C(n,m)=C(n,n-m)=C(n-1,m-1)+C(n-1,m)。

⑺ 数学排列组合公式算法

交你个简单的运用发比如a3/5=5*4*3
这个你就从5开始往下乘3位数,也就是
5*4*3在看a2/5=5*4
同样从5开始往下乘,乘两位,
也就是5*4在比如a4/7=7*6*5*4
这就是从7开始往下乘4位,
就是7*6*5*4又如a5/7=7*6*5*4*3
这就是从7开始往下乘5个,就是7*6*5*4*3
其实这些公式很容易的,向这种,你就看a
下面的数字是多少,就从那个数开始乘,
a上面的那个数字就是它要向下乘的几位数。
你照我上面写的这个方法,随便写两个算算就会明白的
n!那个是阶层
和上面有个共同点,其实n!又可以写成a
n/n
比如5!=a5/5
即从5开始往下乘5位,5*4*3*2*1
这种你就从那个数字开始往下成,一直乘到1
希望我的方法能让你学会,你自己试试

热点内容
编程漩涡 发布:2025-02-01 16:01:51 浏览:325
司机会所访问 发布:2025-02-01 15:54:11 浏览:780
家用电脑改成服务器并让外网访问 发布:2025-02-01 15:30:23 浏览:354
javac工资 发布:2025-02-01 15:24:28 浏览:22
如何删除服务器登录账号 发布:2025-02-01 15:21:05 浏览:498
瑞萨编程器 发布:2025-02-01 15:19:18 浏览:85
上海ntp服务器搭建 发布:2025-02-01 15:03:38 浏览:991
c游戏编程基础 发布:2025-02-01 15:00:17 浏览:993
routejs怎么动态配置 发布:2025-02-01 14:59:07 浏览:502
家用电脑安装服务器内存 发布:2025-02-01 14:38:50 浏览:257