組合數學(球和盒子)
將球是否相同,盒子是否相同,是否可以有空盒分為八種情況。
將球設為\(n\)個,盒子設為\(m\)個(有空盒指的是可以有空盒)。
1.球相同,盒子不同,無空盒
擋板法,相當於將\(n\)個球分成\(m\)組,相當於在\(n-1\)中插入\(m-1\)塊板子。
結論是:\(C_{n-1}^{m-1}\)
2.球相同,盒子不同,有空盒
在每個盒子里面先放\(1\)個球,一共\(m\)個球,現在就等價於(1)的這個問題。
結論是:\(C_{n+m-1}^{m-1}\)
3.球相同,盒子相同,有空盒
假設\(f[n][m]\)為\(n\)個球放到\(m\)個盒子里的方案數。
如果\(n<m\),此時\(m\)個盒子必然裝不滿,\(可得f[n][m] = f[n][n]。\)
如果\(n>=m\),此時可以選擇將盒子放滿或者盒子不放滿。
\(~~~~~(1)\)如果沒放滿,那就減掉一個盒子,此時為\(f[i][j-1]\)。
\(~~~~~(2)\)如果放滿了,那就在每個盒子上里放一個球。現在就是\(f[i-j][j]\)。
\(f[i][j] = f[i][j-1]+f[i-j][j]\)。
得到轉移方程之后考慮邊界條件。
如果沒有球或者只有一個盒子,此時方案數為1,即\(f[0][j] = f[i][1] = 1\)。
for(ll i = 0;i <= n;i++){
for(ll j = 1;j <= m;j++){
if(j == 1|| i == 0)f[i][j] = 1;
else if(i < j) f[i][j] = f[i][i];
else if(i >= j) f[i][j] = f[i-j][j]+f[i][j-1];
}
}
4.球相同,盒子相同,無空盒
類比上面問題3的情況,我們發現答案就是\(f[n-m][m]\)的值。
5.球不同,盒子不同,有空盒
對於每一個球,我們可以放在任意一個位置,也就是說每一個球都有\(m\)種取法。
故一共有\(m^n\)種方案數。
6.球不同,盒子相同,無空盒
這個問題需要拓展第二類斯特林數。
將\(S_2(n,m)\)讀作關於\(n,m\)的第二類斯特林數。
兩種求法:
遞推:
\(S_2(n,m) = S_2(n-1,m-1)+mS_2(n-1,m)\)
單獨看第一個球,如果第一個球獨立存在於一個盒子里面。那么就是\(S_2(n-1,m-1)\)。
如果不是如此,那么就是把這個球放在任意的盒子里面。也就是在\(S_2(n-1,m-1)\)的情況下,找一個盒子塞進去一個球,因為有\(m\)個盒子所以就乘\(m\)。
容斥:
\(S_2(n,m)=\frac{1}{m!}∑_{k=0}^{m}(−1)^kC_m^k(m−k)^n\)
(說實話可能需要用到多項式的知識,所以完全不會)
聯系問題5,問題6還可以得到一個性質
\(n^k = ∑_{i=0}^{k}S_2(k,i)*i!*C_n^i\)
什么意思呢?
左邊指的是,\(k\)個球任意的放在\(i\)個盒子里(5)
右邊,我們枚舉有多少個非空的盒子數\(i\)(盒子不同,乘上\(i!\)),再乘上我們選盒子的方案數。
S[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
S[i][j]=S[i-1][j-1]+j*S[i-1][j];
}
}
7.球不同,盒子不同,無空盒
與上面問題6基本相同,只需要乘\(m!\)即可
\(m!*S_2(n,m)\)
8.球不同,盒子相同,有空盒
也是對6的拓展,只需要枚舉非空盒子的對應的方案數量即可 。
\(\sum_{i=1}^{m}S_2(n,i)\)
對於這個問題我們再引入一個數列——貝爾數
貝爾數\(B_n\)更常見的定義為,將\(n\)個數的集合所有的划分方式,你可以認為這是問題8在盒子數與球數相同時的解。
它有一個遞推公式:
\(B_{n+1} = \sum_{k=0}^nC_n^kB_k\)
證明:
假設,\(B_{n+1}\)是含有\(n+1\)個元素集合的划分個數。
先單獨拿出一個一個元素。
這個元素分為一類,剩下\(n\)個元素,有\(C_n^nB_n\)
這個元素和某1個單獨元素分成一類,\(C_n^{n-1}B_n\)
這個元素和某2個單獨元素分成一類,\(C_n^{n-2}B_n\)
求和可得。
在關注問題8和貝爾數就可以得到貝爾數和第二類斯特林數的關系。
\(B_n = \sum_{k=0}^nS_2(n,k)\)
以上就是盒子和小球小小的總結。