組合數


定義

我們定義 \(C_n^m\) 為在 \(n\) 個元素中選擇 \(m\) 個元素的不同的組合方式,即組合數。

性質

1.計算公式:

\[C_n^m=\frac{n!}{m!(n-m)!} \]

我們記 \(A_n^m\) 為在 \(n\) 個元素中選 \(m\) 個元素的不同的排列方式,即排列數。

我們易得:

\[A_n^m=n(n-1)(n-2)(n-3)…(n-m+1)=\frac{n!}{(n-m)!} \]

規定 \(0!=1\)
可能有人不理解這倆柿子是怎么轉化的,其實很簡單,從 \(1\) 一直乘到 \(n-m+1\) 不久相當於從 \(1\) 乘到 \(n\) 再除以 \(1\) 乘到 \(n-m\) 嗎?

則有:

\[C_n^m=\frac{A_n^m}{A_m^m}=\frac{\frac{n!}{(n-m)!}}{m!}=\frac{n!}{m!(n-m)!} \]

2.互補性

\[C_n^m=C_n^{n-m} \]

口胡:對於每選出 \(m\) 種元素的一種組合,都有剩余沒選的 \(n-m\) 個元素組成另一種組合。

3.組合數恆等式

\[C_{n+1}^m=C_n^m+C_n^{m-1} \]

通俗一點翻譯過來為:在原先的 \(n\) 個元素中多加入一個元素,根據分類加法計數原理,在原先的\(C_n^m\)下,顯然少了含有新元素的情況。若要放進一個新元素,要拿出一個老元素供這個新元素放置, 即加上 \(C_n^{m-1}\) 種方案。

求解

對於數據范圍較小且在 \(long long\) 范圍內,直接套公式求即可,但如果需重復計算,這將會浪費大量時間,可以先求出階乘表,直接調用即可。

當然這里不是要說這個,這里要介紹的是遞推求法。

基於組合數恆等式,令 \(n=n+1\),那么式子就轉化為了

\[C_n^m=C_{n-1}^m+C_{n-1}^{m-1} \]

結合數學上的規定:\(C_i^0=C_1^1=1\)\(C_0^0=0\) 得出遞推開始條件。

\[dp[0][0]=0 \]

\[dp[i][0]=dp[1][1]=1,i \in [1,m] \]

遞推式:

\[dp[i][j]=dp[i-1][j]+dp[i-1][j-1] \]

Code

void init() {
	f[1][0]=f[1][1]=1;
	for(int i=2; i<=n; i++) {
	    f[i][0]=1;
	    for(int j=1; j<=i; j++) {
		f[i][j]=f[i-1][j]+f[i-1][j-1];
	    }
	}
}

類似於楊輝三角的遞推式,想了解的自行查閱?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM