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})\)

posted @ 2020-10-29 09:02  ke_xin  阅读(2226)  评论(0编辑  收藏  举报