“n个球放到m个盒子”问题整理(Twelvefold way)
这个算法的正式名字是:“Twelvefold way”,共用12种情况。
一、球异,盒同
不空
该情况为经典的第二类斯特灵数
设 \(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个盒子”问题整理(Twelvefold way)的更多相关文章
- 一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数
前段时间,做了一个某游戏的辅助计算工具,其中遇到一个排列组合问题.抽象出来就是 将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件, 请给出所有的这些状态. 随意找了下没有现 ...
- 浅谈"n个球"和"m个盒子"之间的乱伦关系
无视标题,从我做起 update in 2018.10.1: 补充了"至多为1的四中情况" 这玩意儿的官方名字应该是叫"Twelvefold way",共用12 ...
- Octopus系列之开发中灵光点收集,先放到这里,后面会整理的
项目中引用的组件 1.System.Data.SQLite.dll 自行编译 SQLite-1.0.66.0-source 3.5的框架:F:\Code\开源项目\SQLite\1.0.66.0_x8 ...
- [luogu1655][小朋友的球]
luogu1665 思路 一道第二类斯特兰数的模板题.只不过需要写个高精. f[i][j]表示前i个球放到j个盒子里的方案数.第i个球可以单独一个盒子,所以f[i][j]+=f[i-1][j-1].还 ...
- 2016 Multi-University Training Contest 7
6/12 2016 Multi-University Training Contest 7 期望 B Balls and Boxes(BH) 题意: n个球放到m个盒子里,xi表示第i个盒子里的球的数 ...
- SGU 441 Set Division(矩阵快速幂)
题目链接:http://acm.sgu.ru/status.php 题意:将n个有区别的球放到m个无区别的盒子里,盒子不能为空.不同的方案数. 思路:设f[i][j]表示将前i个球放到j个盒子里,那么 ...
- [wikioi]数的划分
http://wikioi.com/problem/1039/ 划分型DP.最终的思路是,F[i][j]表示i分成j份,如果分出来的有1,那么去掉1,就是F[i-1][j-1]:如果没有1,那就都减1 ...
- HDU5810 Balls and Boxes
Balls and Boxes Time Limi ...
- [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]
Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...
- hdu-5810 Balls and Boxes(概率期望)
题目链接: Balls and Boxes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
随机推荐
- Spring Boot Bean的多种加载方式
在 Spring Boot 中,您可以以多种方式加载 Bean,这取决于项目的需求和设计.以下是一些常见的加载 Bean 的方式以及相应的示例源代码. 1.组件扫描(Component Scannin ...
- python内置模块——logging
内置模块-logging loging模块是python提供的内置模块,用来做日志处理. 日志等级: 等级 释义 级别数值 CRITICAL(fatal) 致命错误,程序根本跑不起来 50 ERROR ...
- SpringBoot进阶教程(七十八)邮件服务
Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfig ...
- Hudi 在 vivo 湖仓一体的落地实践
作者:vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下,vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能.主要应用在流批同源.实时链路优化及宽表拼接等业务场景 ...
- visual studio 2013 汇编环境配置
网上有很多教程,但是第一次运行仍然出现很多问题,后来我发现忽视了几个个重要的点!!!红色字体标注 教程搬自:https://github.com/JunpengCode/Assembly https: ...
- Cloudeye对接Prometheus实现华为云全方位监控
本文分享自华为云社区<Cloudeye对接Prometheus实现华为云全方位监控>,作者:可以交个朋友 . 一. 背景 云眼系统Cloudeye服务为我们提供了针对弹性云服务器.宽带等资 ...
- Oracle体系机构、基本术语
oracle实例.oracle数据库.oracle服务器,这三个术语容易混淆. oracle实例 实例是一个非固定的.基于内存基本进程和内存接口生成.当oracle服务器关闭后,实例也就消失. ora ...
- Selenium接管已经打开的浏览器并爬取数据
""" P.S:需要接管现有浏览器 ** 使用步骤: 1.打开浏览器,设置好远程调试端口,并扫描登录淘宝. chrome.exe --remote-debugging-p ...
- 学习JVM---入门
1.JVM体系结构 JVM的位置 JVM体系结构 2.类加载器 双亲委派机制 package java.lang; /** * 测试自定义java.lang.String类能否运行成功 * 体会双亲委 ...
- ElasticSearch之Task management API
命令样例如下: curl -X GET "https://localhost:9200/_tasks?pretty" --cacert $ES_HOME/config/certs/ ...