组合数学(2)——盒子与球
组合数学(球和盒子)
将球是否相同,盒子是否相同,是否可以有空盒分为八种情况。
将球设为\(n\)个,盒子设为\(m\)个(有空盒指的是可以有空盒)。
1.球相同,盒子不同,无空盒
挡板法,相当于将\(n\)个球分成\(m\)组,相当于在\(n-1\)中插入\(m-1\)块板子。
结论是:\(C_{n-1}^{m-1}\)
2.球相同,盒子不同,有空盒
在每个盒子里面先放\(1\)个球,一共\(m\)个球,现在就等价于(1)的这个问题。
结论是:\(C_{n+m-1}^{m-1}\)
3.球相同,盒子相同,有空盒
假设\(f[n][m]\)为\(n\)个球放到\(m\)个盒子里的方案数。
如果\(n<m\),此时\(m\)个盒子必然装不满,\(可得f[n][m] = f[n][n]。\)
如果\(n>=m\),此时可以选择将盒子放满或者盒子不放满。
\(~~~~~(1)\)如果没放满,那就减掉一个盒子,此时为\(f[i][j-1]\)。
\(~~~~~(2)\)如果放满了,那就在每个盒子上里放一个球。现在就是\(f[i-j][j]\)。
\(f[i][j] = f[i][j-1]+f[i-j][j]\)。
得到转移方程之后考虑边界条件。
如果没有球或者只有一个盒子,此时方案数为1,即\(f[0][j] = f[i][1] = 1\)。
for(ll i = 0;i <= n;i++){
for(ll j = 1;j <= m;j++){
if(j == 1|| i == 0)f[i][j] = 1;
else if(i < j) f[i][j] = f[i][i];
else if(i >= j) f[i][j] = f[i-j][j]+f[i][j-1];
}
}
4.球相同,盒子相同,无空盒
类比上面问题3的情况,我们发现答案就是\(f[n-m][m]\)的值。
5.球不同,盒子不同,有空盒
对于每一个球,我们可以放在任意一个位置,也就是说每一个球都有\(m\)种取法。
故一共有\(m^n\)种方案数。
6.球不同,盒子相同,无空盒
这个问题需要拓展第二类斯特林数。
将\(S_2(n,m)\)读作关于\(n,m\)的第二类斯特林数。
两种求法:
递推:
\(S_2(n,m) = S_2(n-1,m-1)+mS_2(n-1,m)\)
单独看第一个球,如果第一个球独立存在于一个盒子里面。那么就是\(S_2(n-1,m-1)\)。
如果不是如此,那么就是把这个球放在任意的盒子里面。也就是在\(S_2(n-1,m)\)的情况下,找一个盒子塞进去一个球,因为有\(m\)个盒子所以就乘\(m\)。
容斥:
\(S_2(n,m)=\frac{1}{m!}∑_{k=0}^{m}(−1)^kC_m^k(m−k)^n\)
(说实话可能需要用到多项式的知识,所以完全不会)
联系问题5,问题6还可以得到一个性质
\(n^k = ∑_{i=0}^{k}S_2(k,i)*i!*C_n^i\)
什么意思呢?
左边指的是,\(k\)个球任意的放在\(i\)个盒子里(5)
右边,我们枚举有多少个非空的盒子数\(i\)(盒子不同,乘上\(i!\)),再乘上我们选盒子的方案数。
S[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
S[i][j]=S[i-1][j-1]+j*S[i-1][j];
}
}
7.球不同,盒子不同,无空盒
与上面问题6基本相同,只需要乘\(m!\)即可
\(m!*S_2(n,m)\)
8.球不同,盒子相同,有空盒
也是对6的拓展,只需要枚举非空盒子的对应的方案数量即可 。
\(\sum_{i=1}^{m}S_2(n,i)\)
对于这个问题我们再引入一个数列——贝尔数
贝尔数\(B_n\)更常见的定义为,将\(n\)个数的集合所有的划分方式,你可以认为这是问题8在盒子数与球数相同时的解。
它有一个递推公式:
\(B_{n+1} = \sum_{k=0}^nC_n^kB_k\)
证明:
假设,\(B_{n+1}\)是含有\(n+1\)个元素集合的划分个数。
先单独拿出一个一个元素。
这个元素分为一类,剩下\(n\)个元素,有\(C_n^nB_n\)
这个元素和某1个单独元素分成一类,\(C_n^{n-1}B_n\)
这个元素和某2个单独元素分成一类,\(C_n^{n-2}B_n\)
求和可得。
在关注问题8和贝尔数就可以得到贝尔数和第二类斯特林数的关系。
\(B_n = \sum_{k=0}^nS_2(n,k)\)
以上就是盒子和小球小小的总结。