n个小球放入m个盒子
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})\)