n個小球放入m個盒子
球可以相同也可以不同,盒子可以一樣也可以不一樣,盒子可以空也可以不能空,那么一共就有\(2*2*2=8\)種
總結:
1 、2 、6組合數
1.球同,盒不同,不能空
插板法,\(n-1\)個空隙插\(m-1\)個板
\(C(n-1,m-1)\)
2.球同,盒不同,能空
如果給每個盒子一個球,就可以把問題轉化為不能空的情況了,就相當於\(n+m\)個小球放入\(m\)個盒子且不能空
\(C(n+m-1,m-1)\)
3.球不同,盒同,不能空
\[第二類斯特林數dp[n][m]代表n個小球放入m個不同的盒子且不能空的方法\\ dp[n][m]=m*dp[n-1][m]+dp[n-1][m-1],1<=m<n\\ 第n個球可以放在之前的m個箱子,所以m*dp[n-1][m];\\也可以新開一個箱子來存放,所以dp[n-1][m-1]\\ dp[k][k]=1,k>=0\\ i個小球放入i個盒子,就只能1個盒子放1個\\ dp[k][0]=0,k>=1\\ \\ 通項公式:\\ 假設集合沒有非空的限制,則答案顯然是m^n\\ 我們可以利用容斥原理,枚舉[至少]有幾個集合是空的\\ s2(n,m)=\frac{1}{m!}*\sum_{k=0}^{m}(-1)^k\dbinom{m}{k}(m-k)^n\\ 前面除以m! 因為上面的枚舉是有序的,所以要消去順序 \]
4.球不同,盒同,可以空
這個就是第二類斯特林數第二維前綴和——貝爾數
那就是3的情況(球不同,盒同,不允許為空)用1個盒子+用2個盒子+...+m個盒子
$ \sum_{i=1}^{m}dp[n][i]~ (dp[n][i]是第二類斯特林數))$
還有一個遞推:
\[B_{n+1}=\sum_{k=0}^{n}\dbinom{n}{k}B_k \]
5.球不同,盒不同,不能空
那就是3的情況(球不同,盒同,不允許為空)對盒子進行全排列
\(m!*dp[n][m]\)
6.球不同,盒不同,可以空
每個球都有\(m\)種選擇,且相互獨立
\(m^n\)
7.球同,盒同,可以空
整數划分——
\[也是個dp問題\\ dp[i][j]代表球同,盒同,可以空的放法\\ 當i>=j時,dp[i][j]=dp[i][j-1]+dp[i-j][j]\\ (我們可以在所有的盒子上放一個球dp[i-j][j],\\ 也可以不選擇這種操作,但是以后都不對其中一個盒子進行操作了,那就是dp[i][j-1])\\ 當i<j時,dp[i][i](多余的盒子都沒有什么卵用了)\\ 當j=1時,1(只有一個盒子了就只能放在那個盒子了,只有一種放法)\\ 當i=1時,1(只有一個球了,放哪個盒子都一樣,只有一種放法)\\ 當i=0時 1(沒有球了,也是1種方法) \]
例題:https://www.luogu.com.cn/problem/P2386
#include<iostream>
const int N = 11;
int dp[N][N] , t, n, m;
int main() {
for (int i = 0; i < N; ++i)
for (int j = 1; j < N; ++j) {
if (i <= 1 || j == 1) dp[i][j] = 1;
else if (i < j) dp[i][j] = dp[i][i];
else dp[i][j] = dp[i][j - 1] + dp[i - j][j];
}
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
printf("%d\n", dp[n][m]);
}
return 0;
}
8.球同,盒同,不能空
那就是7的情況(球同,盒同,可以空)每個盒子先放一個保證不空
所以答案就是
\(dp[n-m][m](n>=m)\)
\(0(n<m)\)
其中dp是情況7的dp
bzoj2729s
全錯位排列遞推公式
把編號 1-n的小球放到編號1-n的盒子里,全錯位排列(1號球不在1號盒,2號球不在2號盒,依次類推),共有幾種情況?
\(f_n=(n-1)(f_{n-1}+f_{n-2})\)