“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 ...
随机推荐
- 大数据开发要学什么java还是python?
在大数据开发领域,Java和Python都是备受青睐的编程语言.它们分别具有各自独特的特点和优势,在大数据处理方面也有不同的应用场景. 以下是对Java和Python在大数据开发中的应用.优势以及学习 ...
- 【总结】IntelliJ IDEA 插件
1..iBATIS/MyBatis plugin轻松通过快捷键找到MyBatis中对应的Mapper和XML,CTRL+ALT+B 2.iBATIS/MyBatis plugin轻松通过快捷键找到My ...
- 吉特日化MES系统&生产工艺控制参数对照表
吉特日化MES生产工艺参数对照表 工艺编号 PROCE_BASE_TIMER 工艺名称 定时器 工艺说明 主要用于生产工艺步骤过程计时 参数编号 参数名称 参数描述 Prop_Timer_Enable ...
- [ABC265G] 012 Inversion
Problem Statement You are given a sequence $A=(A_1,\ldots,A_N)$ of length $N$. Each element is $0$, ...
- Java中“100==100”为true,而"1000==1000"为false?
前言 今天跟大家聊一个有趣的话题,在Java中两个Integer对象做比较时,会产生意想不到的结果. 例如: Integer a = 100; Integer b = 100; System.out. ...
- 一文掌握 Kubernetes 证书
如果你正在自己的环境中运行 Kubernetes,那么了解证书的工作原理以及如何管理它们以确保集群的安全性和完整性至关重要.在本文中,我们将解释什么是 Kubernetes 证书.其重要性,以及如何检 ...
- Windows Server 2016配置NTP客户端
前提:开通Windows Time 服务 输入services.msc进入服务管理界面,找到Windows Time 开启服务. 情况1:可以直接设置NTP时钟 控制面板--时钟和区域--设置时间和日 ...
- Redis 使用的 10 个小技巧
Redis 在当前的技术社区里是非常热门的.从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路. 随之而来的一系列最佳实践,使得大多数人可以正确地 ...
- 记录一次K8s pod被杀的排查过程
问题描述 今天下午运维反馈说我们这一个pod一天重启了8次,需要排查下原因.一看Kiban日志,jvm没有抛出过任何错误,服务就直接重启了.显然是进程被直接杀了,初步判断是pod达到内存上限被K8s ...
- 2021-01-14:timsort是什么,如何用代码实现?
福哥答案2021-01-14: 答案来自此链接: 介绍: timsort是一种混合.稳定高效的排序算法,源自合并排序和插入排序,旨在很好地处理多种真实数据.它由Tim Peters于2002年实施使用 ...