这个算法的正式名字是:“Twelvefold way”,共用12种情况。

本文转载自:自为风月马前卒的博文:浅谈"n个球"和"m个盒子"之间的关系

一、球异,盒同

不空

该情况为经典的第二类斯特灵数

设 \(f[n][m]\) 表示答案

\(f[n][m] = f[n - 1][m - 1] + m\times f[n - 1][m]\)

边界条件:\(f[0][0] =1\)

答案 = 第 \(n\) 个数单独占一个盒子 + 第 \(n\) 个数和之前的数共占一个盒子,同时考虑不同位置的贡献

注意最后要乘 \(m\),因为第 \(n\) 个数放置的位置对答案是有影响的

例如:\(\{1\}\{2,4\}\{3\}\) 与 \(\{1\}\{2\}\{3,4\}\) 是不同方案

题目中的应用

可空

直接枚举用了多少个盒子

设 \(g[n][m]\) 表示答案

则 \(g[n][m] = \sum_{i=0}^mg[n][i]\)

至多放 \(1\)

此类"至多放 \(1\)​ "的问题若 \(n>m\) 则方案数一定为 \(0\)

答案:\([n\le m]\)

二、球异,盒异

可空

每一个球都有 \(m\) 种方法,故答案为 \(m^n\)

不空

设 \(g[n][m]\) 表示答案,\(s[n][m]\) 为第二类斯特灵数

则 \(g[n][n] = s[n][m] \times m!\)

相当于是考虑 \(m\) 个盒子的顺序

至多放 \(1\)

\(ans = m!(m-1)!...(m-n+1)!=\frac{m!}{(m-n)!}\)​

球同,盒异

不空

插板法的经典例题

\(n\) 个球之间形成 \(n-1\) 个空位,把 \(m\) 个盒子塞到里面.

方案为 \(C_{n-1}^{m-1}\)

可空

注意这里不能直接套用“插板法”得到 \(C_{n+1}^{m-1}\)

因为使用插板法的前提条件之一就是“分成的方案不能为空”

考虑先在每个盒子中放一个小球,那么剩下的小球再往里放的时候就可以无视“非空的条件了”

故方案为 \(C_{n+m-1}^{m-1}\)

这里再补充一下为什么不能直接套用插板法

比如 \(n=2,m=3\) 时,方案为 \(6\),而直接套用插板法得到的答案为\(3\)。

究其原因,是因为没有考虑到两个板同时占了一个空位的情况。

至多放 \(1\)

考虑每个球放在了哪里。

\(ans = C_m^n\)

球同,盒同

可空

这种情况下,不同方案之间与具体用了哪个球以及放到了哪个盒子里都没有必然的联系

区分不同方案的方法是:把每个盒子的球的个数从小到大排序,比较最终的情况是否相同

例如:\(1\ 7\ 1\)​ 与 \(1\ 1\ 7\) 实际是一种方案

对于 \(n=8,m=3\) 而言一共有 \(10\) 种不同的放法

0 0 8
0 1 7
0 2 6
0 3 5
1 1 6
1 2 5
1 3 4
2 3 4
3 3 3

从上面的分析我们也不难得出结论

\(n\)​​ 个相同的小球放到 \(m\)​​ 个相同的盒子里,盒子可以为空的方案数 与一个整数 \(n\)​ 拆成 \(m\) 段非递减序列的方案数相同

设 \(f[n][m]\) 表示 \(n\) 个小球放到 \(m\) 个相同的盒子里,盒子可以为空的方案数

边界条件为 \(f[0][k]=1,f[1][k]=1,f[k][1]=1\)

递推方程 \(f[n][m]=\left\{\begin{array}{ll}
f[n-m][m]+f[n][m-1] & n>=m \\
f[n][m-1] & n<m
\end{array}\right.\)

解释一下:

我们考虑这 \(m\) 个位置中是否有空盒子

显然:答案 = \(m\)个位置中至少有 \(1\) 个位置为空的方案 \(+ m\) 个位置中全不为空的方案

不空

我们可以先在所有盒子里都放了一个,然后对剩下的球讨论

同样可以得到一个结论:

\(n\)​ 个相同的球,放到 \(m\) 个相同的盒子里,盒子不能为空的方案数 与把整数 \(n\) 拆成 \(m\) 段,每段不能为 \(0\) 的方案数相同

设 \(g[n][m]\) 表示 \(n\) 个小球放到 \(m\) 个相同的盒子里,盒子不能为空的方案数

则 \(g[n][m] = f[n - m][m]\)

题目链接:Here

至多放1

\(ans = [n\le m]\)

参考资料

“n个球放到m个盒子”问题整理

“n个球放到m个盒子”问题整理(Twelvefold way)的更多相关文章

  1. 一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数

    前段时间,做了一个某游戏的辅助计算工具,其中遇到一个排列组合问题.抽象出来就是 将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件, 请给出所有的这些状态. 随意找了下没有现 ...

  2. 浅谈"n个球"和"m个盒子"之间的乱伦关系

    无视标题,从我做起 update in 2018.10.1: 补充了"至多为1的四中情况" 这玩意儿的官方名字应该是叫"Twelvefold way",共用12 ...

  3. Octopus系列之开发中灵光点收集,先放到这里,后面会整理的

    项目中引用的组件 1.System.Data.SQLite.dll 自行编译 SQLite-1.0.66.0-source 3.5的框架:F:\Code\开源项目\SQLite\1.0.66.0_x8 ...

  4. [luogu1655][小朋友的球]

    luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...

  5. 2016 Multi-University Training Contest 7

    6/12 2016 Multi-University Training Contest 7 期望 B Balls and Boxes(BH) 题意: n个球放到m个盒子里,xi表示第i个盒子里的球的数 ...

  6. SGU 441 Set Division(矩阵快速幂)

    题目链接:http://acm.sgu.ru/status.php 题意:将n个有区别的球放到m个无区别的盒子里,盒子不能为空.不同的方案数. 思路:设f[i][j]表示将前i个球放到j个盒子里,那么 ...

  7. [wikioi]数的划分

    http://wikioi.com/problem/1039/ 划分型DP.最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1]:如果没有1,那就都减1 ...

  8. HDU5810 Balls and Boxes

    Balls and Boxes                                                                            Time Limi ...

  9. [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]

    Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...

  10. hdu-5810 Balls and Boxes(概率期望)

    题目链接: Balls and Boxes Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/O ...

随机推荐

  1. H.264 和 H.265对比

    前言 H.264标准正式发布于2003年3月,距今已经20多年了,但它仍然是当下最流行的视频编解码标准. H.265正式发布于2013年4月.虽然H.265标准是围绕着H.264进行制定的,也保留了原 ...

  2. 不要用第三方日志包了Microsoft.Extensions.Logging功能就很强大

    在.NET中,Microsoft.Extensions.Logging是一个广泛使用的日志库,用于记录应用程序的日志信息.它提供了丰富的功能和灵活性,使开发人员能够轻松地记录各种类型的日志,并将其输出 ...

  3. SpringBoot项目中常见组件的配置属性

    本文本的属性摘录自官方Properties配置清单,并附加了国内开发常用的框架配置属性.以国内WEB开发中,所涉及的常见组件为顺序组织配置清单 1. 配置属性清单 1.1 日志配置 序号 属性名 类型 ...

  4. 七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置

    前言 在上一章节我们在后端框架中引入 SQLite-net ORM 并封装常用方法(SQLiteHelper),今天我们的任务是设计好班级管理相关的表.完善后端班级管理相关接口并对Swagger自定义 ...

  5. hexo+icarus博客搭建

    展示效果:米七小站 环境准备 安装nodejs.git.hexo Hexo官网文档 Hexo初始化项目 $ hexo init myblog $ cd myblog $ yarn 查看效果 $ hex ...

  6. Python 潮流周刊第一季完结(1~30)

    你好,我是猫哥.庆祝 Python 潮流周刊在几天前顺利更新到了第 30 期! 我觉得这是一个很有意义的时间节点,不太短也不漫长,很适合作一个小小的总结. 我打算今后每 30 期作为一季,都给大家做一 ...

  7. 华企盾DSC服务器无法启动常见处理方法

    先查看<服务问题判断>文档.常见的 1.授权已经过期--需延长授权 2.ERR_BASE64 – 机器码变更 3.不能在该计算机上使用该数据库,需要解锁才可以--打开服务器配置解锁数据库 ...

  8. .NET 8上进行PDF合并

    前言:在.NET 8中使用itext7需安装 itext7 和 itext7.bouncy-castle-fips-adapter 两个Nuget包,或者使用Aspose.PDF.PdfSharpCo ...

  9. Ubuntu20.04 安装shutter

    1 sudo add-apt-repository ppa:linuxuprising/shutter 2 3 sudo apt install shutter 4 5 卸载 6 sudo apt-g ...

  10. 数据交换不失控:华为云EDS,让你的数据你做主

    摘要:华为云EDS在"可信.可控.可证"的框架基础上进行数据空间的关键设计,打造数据可控交换的全栈能力. 数字社会,每时每刻都有海量数据产生,数据也逐渐从生产过程的附属产物,逐渐成 ...