“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 ...
随机推荐
- Windows之——pid为4的system进程占用80端口的解决办法
因为Apache无法启动的原因,用netstat命令查看了一下80端口是否被占用了,如下 C:\Users\Maple>netstat -ano | findstr 0.0.0.0:80 TCP ...
- Django笔记四十三之使用uWSGI部署Django系统
本文首发于公众号:Hunter后端 原文链接:Django笔记四十三之使用uWSGI部署Django系统 目前部署 Django 的方式一般来说是使用 Nginx + uWSGI + Django 来 ...
- cookie和session的区别?一文讲透
一.问题 cookie和session的区别? 二.回答 1.总结如下- cookie: - cookie存储于客户端本地,即浏览器缓存 - cookie存储着sessionId,作为后台sessio ...
- 最新版本——Hadoop3.3.6单机版完全部署指南
大家好,我是独孤风,大数据流动的作者. 本文基于最新的 Hadoop 3.3.6 的版本编写,带大家通过单机版充分了解 Apache Hadoop 的使用.本文更强调实践,实践是大数据学习的重要环节, ...
- Springboot+shiro,完整教程,带你学会shiro
您的第一个 Apache Shiro 应用程序 引入依赖: <?xml version="1.0" encoding="UTF-8"?> <p ...
- [ARC145D] Non Arithmetic Progression Set
Problem Statement Construct a set $S$ of integers satisfying all of the conditions below. It can be ...
- Critical error detected c0000374
我发现出现上述错误是 free 两次内存 float* dd=new float[2]; delete[] dd; delete[] dd;
- 当数字孪生系统接入CesiumJS,将为智慧城市项目带来怎样的改变?
数字孪生系统接入CesiumJS的契机,正是智慧城市项目的需要.因为许多智慧城市项目中包含了大量地形.倾斜摄影.DOM.DEM等GIS数据,那么为了能够在数字孪生系统中导入这些GIS数据,同时让这些数 ...
- Android联系人增删改查
1:申请权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-p ...
- 文心一言 VS 讯飞星火 VS chatgpt (169)-- 算法导论13.2 2题
二.用go语言,证明:在任何一棵有 n 个结点的二叉搜索树中,恰有 n-1种可能的旋转. 文心一言: 要证明在任何一棵有 n 个结点的二叉搜索树中,恰有 n-1 种可能的旋转,我们可以按照以下步骤逐步 ...