放球问题在组合数学中是一个经典问题,在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];}
}
PS:如果(n<m),其结果与dp[n][n]相同。

二、 球相同,盒相同,不允许空盒

由于要求没有空盒,我们先在每个盒子里放一个球即可,剩下(n-m)个球可以随意放,问题就转化为了有(n-m)个球,允许空盒,有多少种情况,容易发现这就是上面的dp[n-m][m]。

三、 球相同,盒不相同,不允许空盒

用隔板法即可解决:球之间有(n-1)个空,由于要分成m份,所以应该插(m-1)个隔板,所以方案数为C(n-1,m-1)。

四、 球相同,盒不相同,允许空盒

可根据三推得:首先我们假设先在每个盒子里放一个球,然后再往任意盒中放n个球,在这个前提下,问题就转化为共有(n+m)个球,要放到m个盒子中,不允许空盒的方案数,即C(n+m-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

组合数学之放球问题 【附斯特林数】相关推荐

  1. 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )

    文章目录 一.Stirling 子集数 二.放球模型 三.Stirling 子集数递推公式 四.Stirling 子集数示例 ( 四元集等价关系个数 ) 五.划分的二元关系 加细关系 一.Stirli ...

  2. 【组合数学】第一类,第二类斯特林数(Stirling),Bell数

    第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...

  3. 信奥中的数学:斯特林数、卡特兰数

    P1287 盒子与球(球不同 盒不同 不允许有空盒) 盒子与球 - 洛谷 第二类斯特林数总结 第二类斯特林数总结 - _zjz 的博客 - 洛谷博客 P4091 [HEOI2016/TJOI2016] ...

  4. 【HDU 2512】第二类斯特林数

    第二类斯特林数:n 个不同的小球放进 r 个 相同的盒子 :n 个不同的小球放进 r 个相同的盒子 :最后一个小球单独放进一个盒子里面 :前面 n - 1个球放进了 r 个盒子里面,最后一个球放进 r ...

  5. 合理放球(递推之第二类斯特林数 C++)

    合理放球 总时间限制: 1000ms 内存限制: 65536kB 描述 n个各不相同球放入m个相同的盒子里,球全部放完后,要求最后没有空盒!求不同的放法总数. 输入 一行两个数n和m n表示球数,m表 ...

  6. java第二类斯特林数编程代码,Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)...

    我bingoyes再高精用STL就饿死,死外边! string真的爽... 斯特林数模板题:\(S(n,m) = S(n-1,m-1)+S(n-1,m)*n\) #include #include # ...

  7. 放球问题 组合数学 转自百度百科

    放球问题是指把 n个球放到 m个盒子里的方案数.它是组合数学的一个非常重要的问题.根据球是否相同,盒子是否有区别,是否允许有空盒以及n与m 的大小关系,放球问题可分成 16 个子问题.不同情况总结见下 ...

  8. 【组合数学】第二类斯特林数

    一.定义 第二类Stirling数即:,又可记为[与第一类的表示有大小写的区别].其表示将n个不同的元素分成m个集合的方案数. 二.理解关键词句 1.集合的一个拆分(表示将n个不同的元素拆分成m个集合 ...

  9. 组合数学 —— 斯特林数(Stirling)

    [第一类斯特林数] 1.定理 第一类斯特林数 S1(n,m) 表示的是将 n 个不同元素构成 m 个圆排列的数目. 2.递推式 设人被标上1,2,.....p,则将这 p 个人排成 m 个圆有两种情况 ...

最新文章

  1. mysql如何查看事务日记_MySQL日志查看详解
  2. Leetcode738. 单调递增的数字[C++题解]:贪心,数学解法
  3. 你是什么类型的程序员?
  4. android11开启无线调试
  5. Windows 10 版本信息
  6. .NET Core技术研究-主机
  7. SpringCloud微服务实战(一)-简介
  8. 射频微电子学_专注于射频前端芯片,苏州汉天下完成新一轮融资
  9. 如何检测Linux内核的Rootkit
  10. mysql 中逆向表模型_PowerDesigner 逆向生成数据库物理模型,以 MySQL 为例
  11. mysql begin end 定界符_mysql存储过程BEGIN END复合语句用法示例
  12. 每日新闻丨​iPhone11成败关系全球众多供应商下一张饭票
  13. python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
  14. Ceres的Options详解
  15. 三子棋游戏(支持多子棋)
  16. 6.1 matlab数值微分与数值积分
  17. 孩子数学成绩不好怎么办_小孩子数学差怎么办
  18. 816墨盒计算机无法与,西通PG-815、CL-816兼容墨盒和总结
  19. The Places of Our Lives: Visiting Patterns and Automatic Labeling from Longitudinal Smartphone Data
  20. 纽约大学研究生 计算机科学 申请,纽约大学计算机科学硕士排名第35(2020年TFE Times排名)...

热门文章

  1. Rust实现:从一组纸牌中挑选Winner纸牌
  2. 郝夫曼(Huffman)树及其应用
  3. 14位数仿科学真计算机,十四位数仿真计算器
  4. SAP权限管理,我的理解
  5. c# 实现金山词霸一样的屏幕取词
  6. CAD手机看图软件中如何根据已知坐标点绘制线段?
  7. hanoi塔经典递归算法
  8. 怎么把多个excel表格合成一个_快速将多个Excel表格合并为1个,你会吗?
  9. android给图片加水印的极简实现方式
  10. endata 电影票房响应数据破解