组合数学(2)——盒子与球

组合数学(球和盒子)

将球是否相同,盒子是否相同,是否可以有空盒分为八种情况。
将球设为n个,盒子设为m个(有空盒指的是可以有空盒)。

1.球相同,盒子不同,无空盒

挡板法,相当于将n个球分成m组,相当于在n1中插入m1块板子。
结论是:Cn1m1

2.球相同,盒子不同,有空盒

在每个盒子里面先放1个球,一共m个球,现在就等价于(1)的这个问题。
结论是:Cn+m1m1

3.球相同,盒子相同,有空盒

假设f[n][m]n个球放到m个盒子里的方案数。

如果n<m,此时m个盒子必然装不满,f[n][m]=f[n][n]

如果n>=m,此时可以选择将盒子放满或者盒子不放满。
     (1)如果没放满,那就减掉一个盒子,此时为f[i][j1]
     (2)如果放满了,那就在每个盒子上里放一个球。现在就是f[ij][j]
f[i][j]=f[i][j1]+f[ij][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[nm][m]的值。

5.球不同,盒子不同,有空盒

对于每一个球,我们可以放在任意一个位置,也就是说每一个球都有m种取法。
故一共有mn种方案数。

6.球不同,盒子相同,无空盒

这个问题需要拓展第二类斯特林数
S2(n,m)读作关于n,m的第二类斯特林数。
两种求法:
递推:
S2(n,m)=S2(n1,m1)+mS2(n1,m)
单独看第一个球,如果第一个球独立存在于一个盒子里面。那么就是S2(n1,m1)
如果不是如此,那么就是把这个球放在任意的盒子里面。也就是在S2(n1,m)的情况下,找一个盒子塞进去一个球,因为有m个盒子所以就乘m
容斥:
S2(n,m)=1m!k=0m(1)kCmk(mk)n
(说实话可能需要用到多项式的知识,所以完全不会)

联系问题5,问题6还可以得到一个性质
nk=i=0kS2(k,i)i!Cni
什么意思呢?
左边指的是,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!S2(n,m)

8.球不同,盒子相同,有空盒

也是对6的拓展,只需要枚举非空盒子的对应的方案数量即可 。
i=1mS2(n,i)

对于这个问题我们再引入一个数列——贝尔数
贝尔数Bn更常见的定义为,将n个数的集合所有的划分方式,你可以认为这是问题8在盒子数与球数相同时的解。
它有一个递推公式:
Bn+1=k=0nCnkBk
证明:
假设,Bn+1是含有n+1个元素集合的划分个数。
先单独拿出一个一个元素。
这个元素分为一类,剩下n个元素,有CnnBn
这个元素和某1个单独元素分成一类,Cnn1Bn
这个元素和某2个单独元素分成一类,Cnn2Bn
求和可得。

在关注问题8和贝尔数就可以得到贝尔数和第二类斯特林数的关系。
Bn=k=0nS2(n,k)

以上就是盒子和小球小小的总结。

posted @   Paranoid5  阅读(2224)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示