組合
理論與公式
從 n {\displaystyle n} 個元素中取出 k {\displaystyle k} 個元素, k {\displaystyle k} 個元素的組合數(shù)量為:
以六合彩為例。在六合彩中從49顆球中取出6顆球的組合數(shù)量為:
在集合中取出k項元素
在有五個元素中的集合中,取出3個元素,形成的子集合
重復(fù)組合理論與公式
從 n {\displaystyle n} 個元素中取出 k {\displaystyle k} 個元素, k {\displaystyle k} 個元素可以重復(fù)出現(xiàn),這組合數(shù)量為:
以取色球為例,每種顏色的球有無限多顆,從8種色球中取出5顆球,好比是在5顆球間畫上分隔號“|”代表球色的分布情形。例如第1種色球取1顆,第2種色球取2顆,第3種色球取2顆可以表示成:
可以理解為8類球每類取多少個,一起構(gòu)成5個球。我們把5個球排成一排,用7個分隔線去隔開。如上圖,表示含義:第1根線前表示第一類球取的個數(shù),第1根和第2根線表示第二類球取的個數(shù)...第6第7根線前表示第七類球的個數(shù),第7根后表示第八類球的個數(shù)。亦即問題是從(5+8-1)個位置中挑選出(8-1)個位置擺分隔號,這組合數(shù)量為:
因為組合數(shù)量公式特性,重復(fù)組合轉(zhuǎn)換成組合有另一種公式為:
另外 H k n {\displaystyle H_{k}^{n}} 也可以記為 F k n {\displaystyle F_{k}^{n}} 或 ( ( n k ) ) {\displaystyle \left(\!\!{\binom {n}{k}}\!\!\right)}
取值范圍的擴(kuò)充
在 C k n {\displaystyle C_{k}^{n}} 的定義中,由于它有意義的范圍必須是滿足條件 n ≥ ≥ --> k ≥ ≥ --> 1 {\displaystyle n\geq k\geq 1} ,所以其他范圍必須另外定義,我們有:
演算范例
組合 C
循環(huán)法
/***********************//** This is C++ code. **//** Comb Example **//***********************/#includeusingnamespacestd;boolnext_comb(int*comb,constintn,constintk){inti=k-1;constinte=n-k;docomb[i]++;while(comb[i]>e+i&&i--);if(comb[0]>e)return0;while(++i<k)comb[i]=comb[i-1]+1;return1;}intmain(){intn,k;cout<<"comb(n,k):"<>n>>k;if(n<k||k<=0)return0;int*comb=newint[k];for(inti=0;i<k;i++)comb[i]=i;dofor(inti=0;i<k;cout<<((++i<k)?",":"\n"))cout<<comb[i]+1;while(next_comb(comb,n,k));delete[]comb;return0;}
遞回法
#include#includeusingnamespacestd;namespacecomb{intn,k;intarr[12];intcount;boolarrsame(intsite){if(site>0&&arr[site-1]>=arr[site])return0;return1;}inlinevoidarrprint(){for(inti=0;i<k;i++)printf("%3d",arr[i]);puts("");count++;}voidcalculate(intnow){if(now==k){arrprint();return;}for(inti=0;i<n;i++){arr[now]=i;if(arrsame(now)){calculate(now+1);}}}inlinevoidrun(intnn,intkk){n=nn,k=kk;count=0;if(k=k&&k>0)calculate(0);if(count)printf("\n%d combination.\n\n",count);elseputs("Input error!");}}intmain(){intn,k;while(scanf("%d%d",&n,&k)!=EOF){comb::run(n,k);fflush(stdout);}return0;}
重復(fù)組合 H
循環(huán)法
/***********************//** This is C++ code. **//** ReComb Example **//***********************/#includeusingnamespacestd;boolnext_re_comb(int*recomb,constintn,constintk){inti=k-1;dorecomb[i]++;while(recomb[i]>n-1&&i--);if(recomb[0]>n-1)return0;while(++i<k)recomb[i]=recomb[i-1];return1;}intmain(){intn,k;cout<<"recomb(n,k):"<>n>>k;if(n<=0||k<=0)return0;int*recomb=newint[k];for(inti=0;i<k;i++)recomb[i]=0;dofor(inti=0;i<k;cout<<((++i<k)?",":"\n"))cout<<recomb[i]+1;while(next_re_comb(recomb,n,k));delete[]recomb;return0;}
遞回法
#include#includeusingnamespacestd;namespacere_comb{intn,k;intarr[12];intcount;boolarrsame(intsite){if(site>0&&arr[site-1]>arr[site])return0;return1;}inlinevoidarrprint(){for(inti=0;i<k;i++)printf("%3d",arr[i]);puts("");count++;}voidcalculate(intnow){if(now==k){arrprint();return;}for(inti=0;i<n;i++){arr[now]=i;if(arrsame(now)){calculate(now+1);}}}inlinevoidrun(intnn,intkk){n=nn,k=kk;count=0;if(k0)calculate(0);if(count)printf("\n%d combination.\n\n",count);elseputs("Input error!");}}intmain(){intn,k;while(scanf("%d%d",&n,&k)!=EOF){re_comb::run(n,k);fflush(stdout);}return0;}
推廣
組合數(shù)可以推廣到多分類的情形 ,我們將n個物品分為m份,每份的個數(shù)分別為: k 1 , k 2 ? ? --> k m {\displaystyle k_{1},k_{2}\cdots k_{m}} 個,那么,總的分類數(shù)為
參見
概率論
組合數(shù)學(xué)
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價值
- 一般般
- 沒價值
{{item.userName}} 舉報
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報
{{_reply.time}}