盒子与小球
n个小球放入m个盒子问题
(1)球 相同 也可以 不同
(2)盒 相同 也可以 不同
(3)盒 为空 也可以 不空
合计
1、球相同,盒不同,盒不空
相当于把n个相同小球分成m份,用插板法,在n个小球中间的n-1个空中,插入m-1个板子隔开。
答案为
2、球相同,盒不同,盒能空
在第1类情况下继续分析,我们可以先假设m个盒子里都放好了1个球,所以说白了就是,现在有m+n个相同的球,要放入m个不同的箱子,没有空箱。也就是第1种情,最后在从每个盒子里拿走1个小球。
答案为
3、球不同,盒相同,盒不空
设
情况一:如果
情况二:如果
(1)最后一个小球单独放入一个盒子,则前n-1个小球就放入m-1个盒子,方案总数为
(2)最后一个小球与其他球放一起,因为球已经放入盒子,虽然盒子相同但球不同则选择放入的盒子也不同,故有m种放法。再考虑前n-1个小球放入m个盒子的方案
边界条件
答案为 第二类斯特林数 :
为方便计算后面的问题,设第3类问题答案为
4、球不同,盒相同,盒能空
选出1,2,……,n-1个盒子为空,视做不同方案,这样就和第3类问题相同。
设
答案为贝尔数:
5、球不同,盒不同,盒不空
我们可以用捆绑法将一些小球捆绑成一个小球,这道题可以等价为从n个小球中选出n−m+1个小球合并成一个大球,合并后为m-1个小球和1个大球共m个球,然后求m个球一共有多少种排列。
答案:
6、球不同,盒不同,盒能空
从小球的角度考虑,n个小球都有m种选择,故答案为:
7、球相同,盒相同,盒能空
设
若n<m 则 dp[n][m]=dp[n][n],因为盒子相同故,问题可以拿走m-n个盒子。
由于球相同,故不能对球进行分步考虑,考虑盒子是否存在空盒子的情况。
(1)盒子不为空,则可以将m个盒子中都先放一个小球,问题就转换为了n-m个小球放入m个盒子中的方案数,dp[n][m]=dp[n-m][m]。
(2)盒子存在空,可以拿走一个盒子作为空盒子,问题就转换为了n个小球放入m-1个盒子的方案数,dp[n][m]=d[n][m-1]。
边界条件为n=0或者m=1时,没有球或者只有1个盒子时都只有1种方案。
为方便后面使用设该方案数为
8、球相同,盒相同,盒不空
题目链接:P1025 [NOIP2001 提高组] 数的划分
设
若 n<m 则 dp[n][m]=0 因为无法保证盒子不空
若 n>=m 可以将每个盒子中都放入一个小球,这样该问题就转换为第7类问题,允许为空的情况,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效