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)^kdbinom{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
", 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}))