学习笔记:组合数学之放球问题
组合数学之放球问题&&斯特林数
本文我学习笔记,自我保存,如有不当请指正。//其实我自己都不是很熟(恼)
要求问题是有n个球放入m个盒子中。看似很简单的问题,其实暗藏玄机。
问题分为8种情况。
1.球相同,盒相同,可空。
对于这种情况,没有什么固定的公式,不过可以使用dp来解决。
定义
第一是使新盒子空着,在其他盒子里添加一个球,即为dp
第二是使新盒子为空,即为
总结下来
//伪代码
int dp[N][N];
for(int j=1;j<=m;j++){
dp[0][j]=1;
dp[1][j]=1;
}
for(int i=2;i<=n;i++){
for(int j=1;j<=m;j++){
if(i>=j)dp[i][j]=dp[i-j][j]+dp[i][j-1];
else dp[i][j]=dp[i][j-1];
}
}
2.球相同,盒相同,不可空。
因为没有空盒,所以先在每个盒子里放一个球,问题就变成了第一种情况,但是是求
3.球相同,盒不同,不可空。
很明显,前提是
画图可得,n个球间有
4.球相同,盒不同,可空。
假设
利用插板法求解,
在介绍第五种情况之前,我们先引入一个前置知识——斯特林数
斯特林数(Stirling)分为两类。第一类斯特林数和第二类斯特林数,用于解决不同的问题。(这里只是浅谈,因为深入了我也搞不懂了)
第一类斯特林数解决的是环上的问题。
定义
通常也使用dp的思想转移。(正常情况下圆排列的方案数位
考虑第
若n-1个元素构成了m个圆排列,那么第n个元素插入这m个排列中,有n-1种放法,方案数为
综上所述,我们得出转移方程为
第二类斯特林数解决的是我们求的问题。定义
若
若
综上所述,我们得出转移方程为
现在我们就得到了我们所需要的内容,若想了解更多,建议百度(
以下的S均代表第二类斯特林数!!!
5.球不同,盒不同,可空
这是最简单的一种情况了,小学生都会了(?
对于
6.球不同,盒相同,不可空
这里就是我们刚刚讲的第二类斯特林数,
7.球不同,盒不同,不可空
同样考虑
8.球不同,盒相同,可空
同样离不开斯特林数。因为盒子可空,所以我们考虑n个球放入1至m个盒子的情况,方案数为其总和
组合数的求法就讲完了,代码实现靠你自己了
再次声明,本文为学习笔记,自我保存用,仅供参考。
资料引用:百度百科。
特别鸣谢学长hycc。