组合数学之放球问题 【附斯特林数】
放球问题在组合数学中是一个经典问题,在ACM比赛中也经常会出现类似的题目,这里做一个归纳。
我们假定现在有n个球,要放到m个盒子中,根据情况的不同主要可以分为一下8类(这里确保n>=m)
编号 | n个球是否有区别 | m个盒子是否有区别 | 是否允许空盒 |
---|---|---|---|
1 | 否 | 否 | 是 |
2 | 否 | 否 | 否 |
3 | 否 | 是 | 否 |
4 | 否 | 是 | 是 |
5 | 是 | 否 | 否 |
6 | 是 | 否 | 是 |
7 | 是 | 是 | 否 |
8 | 是 | 是 | 是 |
我们对这些情况逐一分析。
一、 球相同,盒相同,允许空盒
假设dp[i][j]为球相同,盒相同,允许空盒,且有i个球,j个盒子的结果。那么我们可以分成两种情况,一种是放完有空盒的情况,那么我减去一个盒子不影响结果。还有一种是每一个盒子至少有一个球,那我们可以把每个盒子里拿去一个球,那就变成了(i-j)个球,j个盒子的结果了,即dp[i-j][j],两部分相加即可构成状态转移方程。
dp[i][j]=dp[i][j-1]+dp[i-j][j]; (i>=j)
dp[i][j]=dp[i][j-1]; (i<j)
预处理后可以O(1)查询,预处理代码见下
void init()
{memset(dp,0,sizeof(dp));for(int i=0;i<=1;i++)for(int j=1;j<maxn;j++){dp[i][j]=1;}for(int i=2;i<maxn;i++)for(int j=1;j<maxn;j++){if(i>=j)dp[i][j]=dp[i][j-1]+dp[i-j][j];else dp[i][j]=dp[i][j-1];}
}
二、 球相同,盒相同,不允许空盒
由于要求没有空盒,我们先在每个盒子里放一个球即可,剩下(n-m)个球可以随意放,问题就转化为了有(n-m)个球,允许空盒,有多少种情况,容易发现这就是上面的dp[n-m][m]。
三、 球相同,盒不相同,不允许空盒
用隔板法即可解决:球之间有(n-1)个空,由于要分成m份,所以应该插(m-1)个隔板,所以方案数为C(n-1,m-1)。
四、 球相同,盒不相同,允许空盒
知识补充
在介绍5,6,7之前先介绍一个小知识点:斯特林数(已经了解的可以跳过这一部分)。
第一类斯特林数
S(n,m)表示将n个不同物品排成k个非空循环排列的方法数。
可以举个形象点的例子:现在有n个人要围着m张相同圆桌坐下来,要求每张桌子非空,求方案数。
我们可以这样考虑,对于最后一个人:
如果他单独坐一桌的话,结果就是剩下的(n-1)个人围着(m-1)张圆桌而坐的方案数,即S(n-1,m-1)。
如果前面(n-1)个人已经坐了m张圆桌,这(n-1)个人的方案数为S(n-1,m),那么最后一个人就要插入到他们之中,他可以被安排在第一个人或第二个人或。。。或第(n-1)个人的左边,所以这种坐法方案数为(n-1)*S(n-1,m)。 综上所述,就可以写出第一类斯特林数的状态转移方程
S(n,m)=(n-1)*S(n-1,m)+S(n-1,m-1)
第一类斯特林数的预处理代码
void init()
{for(int i=1; i<maxn; i++){s[i][0]=0,s[i][i]=1;for(int j=1; j<i; j++){s[i][j]=(s[i-1][j]*(i-1)+s[i-1][j-1]);}}
}
第二类斯特林数
S(n,m)表示把n个不同物品划分到m个不可区分的盒子中且没有空盒的方案数。
我们还是来考虑最后一个物品,它有两种情况
如果最后一个物品单独放到一个盒子中,那么结果就是剩下的(n-1)个物品放到(m-1)个盒子中,且盒子非的方案数,即S(n-1,m-1)。
如果前面(n-1)个物品放完后已经没有空盒,(方案共有S(n-1,m)种),那么最后一个物品可以放在任意一个中(方案共有m种),总方案数即为m*S(n-1,m)。
综上所述,就可以写出第二类斯特林数的状态转移方程
S(n,m)=m*S(n-1,m)+S(n-1,m-1)
第二类斯特林数的预处理代码
void init()
{for(int i=1; i<maxn; i++){s[i][0]=0,s[i][i]=1;for(int j=1; j<i; j++){s[i][j]=(s[i-1][j]*j+s[i-1][j-1]);}}
}
接下来,我们便可以利用斯特林数解决问题5,6,7了。
【PS】下面用到的均为第二类斯特林数。
五、 球不相同,盒相同,不允许空盒
根据第二类斯特林数的定义,该问题就是n个不同的物品放入m个相同的箱子中且箱子不能为空,即S(n,m)。
六、 球不相同,盒相同,允许空盒
我们只要枚举非空盒的个数(枚举范围为1~n),可以设非空盒的个数为k,那么每次枚举得到的方案数即为S(n,k),总方案数为S(n,1)+S(n,2)+...+S(n,m)。
七、 球不相同,盒不相同,不允许空盒
对比问题七,变化的是盒子从相同变成了不同。我们可以这样考虑,S(n,m)为把n个不同物品分成m份的方案数,现在由于盒子不同,我们只要给盒子排个顺序,然后对应于m份即可,排列顺序有m!种情况,故总方案数为m!*S(n,m)。
八、 球不相同,盒不相同,允许空盒
这个问题最简单了,每个球都能任意选择一个盒子去放,每个球有m种情况,故总方案数为mn。
组合数学之放球问题 【附斯特林数】相关推荐
- 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
文章目录 一.Stirling 子集数 二.放球模型 三.Stirling 子集数递推公式 四.Stirling 子集数示例 ( 四元集等价关系个数 ) 五.划分的二元关系 加细关系 一.Stirli ...
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...
- 信奥中的数学:斯特林数、卡特兰数
P1287 盒子与球(球不同 盒不同 不允许有空盒) 盒子与球 - 洛谷 第二类斯特林数总结 第二类斯特林数总结 - _zjz 的博客 - 洛谷博客 P4091 [HEOI2016/TJOI2016] ...
- 【HDU 2512】第二类斯特林数
第二类斯特林数:n 个不同的小球放进 r 个 相同的盒子 :n 个不同的小球放进 r 个相同的盒子 :最后一个小球单独放进一个盒子里面 :前面 n - 1个球放进了 r 个盒子里面,最后一个球放进 r ...
- 合理放球(递推之第二类斯特林数 C++)
合理放球 总时间限制: 1000ms 内存限制: 65536kB 描述 n个各不相同球放入m个相同的盒子里,球全部放完后,要求最后没有空盒!求不同的放法总数. 输入 一行两个数n和m n表示球数,m表 ...
- java第二类斯特林数编程代码,Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)...
我bingoyes再高精用STL就饿死,死外边! string真的爽... 斯特林数模板题:\(S(n,m) = S(n-1,m-1)+S(n-1,m)*n\) #include #include # ...
- 放球问题 组合数学 转自百度百科
放球问题是指把 n个球放到 m个盒子里的方案数.它是组合数学的一个非常重要的问题.根据球是否相同,盒子是否有区别,是否允许有空盒以及n与m 的大小关系,放球问题可分成 16 个子问题.不同情况总结见下 ...
- 【组合数学】第二类斯特林数
一.定义 第二类Stirling数即:,又可记为[与第一类的表示有大小写的区别].其表示将n个不同的元素分成m个集合的方案数. 二.理解关键词句 1.集合的一个拆分(表示将n个不同的元素拆分成m个集合 ...
- 组合数学 —— 斯特林数(Stirling)
[第一类斯特林数] 1.定理 第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目. 2.递推式 设人被标上1,2,.....p,则将这 p 个人排成 m 个圆有两种情况 ...
最新文章
- mysql如何查看事务日记_MySQL日志查看详解
- Leetcode738. 单调递增的数字[C++题解]:贪心,数学解法
- 你是什么类型的程序员?
- android11开启无线调试
- Windows 10 版本信息
- .NET Core技术研究-主机
- SpringCloud微服务实战(一)-简介
- 射频微电子学_专注于射频前端芯片,苏州汉天下完成新一轮融资
- 如何检测Linux内核的Rootkit
- mysql 中逆向表模型_PowerDesigner 逆向生成数据库物理模型,以 MySQL 为例
- mysql begin end 定界符_mysql存储过程BEGIN END复合语句用法示例
- 每日新闻丨​iPhone11成败关系全球众多供应商下一张饭票
- python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
- Ceres的Options详解
- 三子棋游戏(支持多子棋)
- 6.1 matlab数值微分与数值积分
- 孩子数学成绩不好怎么办_小孩子数学差怎么办
- 816墨盒计算机无法与,西通PG-815、CL-816兼容墨盒和总结
- The Places of Our Lives: Visiting Patterns and Automatic Labeling from Longitudinal Smartphone Data
- 纽约大学研究生 计算机科学 申请,纽约大学计算机科学硕士排名第35(2020年TFE Times排名)...