這個算法的正式名字是:“Twelvefold way”,共用12種情況。
一、球異,盒同
不空
該情況為經典的第二類斯特靈數
設 \(f[n][m]\) 表示答案
\(f[n][m] = f[n - 1][m - 1] + m\times f[n - 1][m]\)
邊界條件:\(f[0][0] =1\)
答案 = 第 \(n\) 個數單獨占一個盒子 + 第 \(n\) 個數和之前的數共占一個盒子,同時考慮不同位置的貢獻
注意最后要乘 \(m\),因為第 \(n\) 個數放置的位置對答案是有影響的
例如:\(\{1\}\{2,4\}\{3\}\) 與 \(\{1\}\{2\}\{3,4\}\) 是不同方案
可空
直接枚舉用了多少個盒子
設 \(g[n][m]\) 表示答案
則 \(g[n][m] = \sum_{i=0}^mg[n][i]\)
至多放 \(1\)
此類"至多放 \(1\) "的問題若 \(n>m\) 則方案數一定為 \(0\)
答案:\([n\le m]\)
二、球異,盒異
可空
每一個球都有 \(m\) 種方法,故答案為 \(m^n\)
不空
設 \(g[n][m]\) 表示答案,\(s[n][m]\) 為第二類斯特靈數
則 \(g[n][n] = s[n][m] \times m!\)
相當於是考慮 \(m\) 個盒子的順序
至多放 \(1\)
\(ans = m!(m-1)!...(m-n+1)!=\frac{m!}{(m-n)!}\)
球同,盒異
不空
插板法的經典例題
\(n\) 個球之間形成 \(n-1\) 個空位,把 \(m\) 個盒子塞到里面.
方案為 \(C_{n-1}^{m-1}\)
可空
注意這里不能直接套用“插板法”得到 \(C_{n+1}^{m-1}\)
因為使用插板法的前提條件之一就是“分成的方案不能為空”
考慮先在每個盒子中放一個小球,那么剩下的小球再往里放的時候就可以無視“非空的條件了”
故方案為 \(C_{n+m-1}^{m-1}\)
這里再補充一下為什么不能直接套用插板法
比如 \(n=2,m=3\) 時,方案為 \(6\),而直接套用插板法得到的答案為\(3\)。
究其原因,是因為沒有考慮到兩個板同時占了一個空位的情況。
至多放 \(1\)
考慮每個球放在了哪里。
\(ans = C_m^n\)
球同,盒同
可空
這種情況下,不同方案之間與具體用了哪個球以及放到了哪個盒子里都沒有必然的聯系
區分不同方案的方法是:把每個盒子的球的個數從小到大排序,比較最終的情況是否相同
例如:\(1\ 7\ 1\) 與 \(1\ 1\ 7\) 實際是一種方案
對於 \(n=8,m=3\) 而言一共有 \(10\) 種不同的放法
0 | 0 | 8 |
---|---|---|
0 | 1 | 7 |
0 | 2 | 6 |
0 | 3 | 5 |
1 | 1 | 6 |
1 | 2 | 5 |
1 | 3 | 4 |
2 | 3 | 4 |
3 | 3 | 3 |
從上面的分析我們也不難得出結論
\(n\) 個相同的小球放到 \(m\) 個相同的盒子里,盒子可以為空的方案數 與一個整數 \(n\) 拆成 \(m\) 段非遞減序列的方案數相同
設 \(f[n][m]\) 表示 \(n\) 個小球放到 \(m\) 個相同的盒子里,盒子可以為空的方案數
邊界條件為 \(f[0][k]=1,f[1][k]=1,f[k][1]=1\)
遞推方程 \(f[n][m]=\left\{\begin{array}{ll} f[n-m][m]+f[n][m-1] & n>=m \\ f[n][m-1] & n<m \end{array}\right.\)
解釋一下:
我們考慮這 \(m\) 個位置中是否有空盒子
顯然:答案 = \(m\)個位置中至少有 \(1\) 個位置為空的方案 \(+ m\) 個位置中全不為空的方案
不空
我們可以先在所有盒子里都放了一個,然后對剩下的球討論
同樣可以得到一個結論:
\(n\) 個相同的球,放到 \(m\) 個相同的盒子里,盒子不能為空的方案數 與把整數 \(n\) 拆成 \(m\) 段,每段不能為 \(0\) 的方案數相同
設 \(g[n][m]\) 表示 \(n\) 個小球放到 \(m\) 個相同的盒子里,盒子不能為空的方案數
則 \(g[n][m] = f[n - m][m]\)
題目鏈接:Here
至多放1
\(ans = [n\le m]\)