经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
浅谈"n个球"和"m个盒子"之间的乱伦关系
来源:cnblogs  作者:自为风月马前卒  时间:2018/9/30 10:45:01  对本文有异议

无视标题,从我做起

球异,盒同

不空

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

设$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}^m g[n][i]$

球异,盒异

可空

每一个球都有$m$种放法,故答案为$m^n$

不空

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

则$g[n][m] = s[n][m] \times m!$

相当于是考虑$m$个盒子的顺序

球同,盒异

不空

插板法的经典例题

$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 ?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] =
\begin{cases}
f[n - m][m] + f[n][m - 1] &n >= m
\
f[n][m - 1] &n < m
\end{cases}$

解释一下:

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

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

不空

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

同样可以得到一个结论:

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

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

则$g[n][m] = f[n - m][m]$,

题目链接

参考资料

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号