曾记否,到中流击水,浪遏飞舟。|

Moyyer_suiy

园龄:2年8个月粉丝:4关注:18

盒球问题

n 个球 和 m 个盒子相关问题的个人理解。


1.球不同盒不同,可空。

n 个都能放到 m 个里:mn

2.球同盒同,可空。

分类讨论。类似于 dp,设 f[i][j] 表示 i 个球放到 j 个盒里方案数。

n<mf(n,m)=f(n,n)

n>=m
有空的:f(n,m)=f(n,m1),m - 1 就是让盒子有空。因为递推中每次都会考虑,所以每种空的情况都会统计。

没有空的:f(n,m)=f(nm,m),就是让 m 个盒子都先放上一个球,这样就能保证不空。

f(n,m)=f(n,m1)+f(nm,m)

3.球同盒同,不空。

n<m 无解。

否则:f(n,m)=f(nm,m)。 其中 f 含义同 2 中含义(可空),f 在这里指本题式子(不可空)。表示:每个盒子先填一个球,对于剩下的球可以有空,直接根据 2 的解法塞到盒子里就行。

紧扣 dp 定义的含义,子问题和原问题性质是否一样?不要弄混。

4.球同盒不同,不空。

插板法:Cn1m1

怎么保证答案正确?

要求不空:则板只能在 n - 1 个空中。

分成 m 份:在空中塞 m - 1 个板。易证。

5.球同盒不同,可空。

发现和上面问题的区别在于多了可以为空的条件。

那么先放 m 个球,保证每个空都有球。然后根据上面的结论,处理 n + m 个球放到 m 个盒子里,不能有空。

Cn+m1m1

6.球不同盒同,不空。

递推。第一个:开一个盒子;第二个:开一个盒子 or 和 1 放在一起;第三个:开一个盒子 or 和 2 放在一起 or 和 1、2放在一起。

....

所以它和别人共用一盒:f(n,m)=f(n1,m)m,乘上 m 是因为,虽然盒同但是球不同。在前面有 m 种盒。

它自己开了一新盒:f(n,m)=f(n1,m1)

综上:f(n,m)=f(n1,m)m+f(n1,m1)

补充:递推式正是第二类斯特林数。

7.球不同盒同,可空。

考虑以盒子为整体,看盒子:空 1 个,空 2 个,空 ... m - 1 个。

然后枚举非空盒子(直接把空盒子摘出去了),把球放过去。

f(n,m) 表示球不同盒同,可空时的方案数。下面式子中的 f(n,m) 含义同 6 中含义。

根据 6 易得:f(n,m)=i=1mf(n,i)。表示枚举非空盒子个数,然后按照 6 处理。

8.球不同盒不同,可空。

和 7 的区别在于盒不同。

那就将 7 的答案乘上盒子的全排列,相当于全排一遍,其他均相同。

另 f''表示球不同盒不同可空的方案数,f''的含义于 7 中相同。

f(n,m)=f(n,m)×m!


并不能想出来其他上面方案....几乎是想出来一个很快就被自己否掉了。我觉得以上应该算这种问题的通解,感觉无论是思路上还是复杂度上大概率都不会有更优的了()。

本文作者:Moyyer_suiy

本文链接:https://www.cnblogs.com/Moyyer-suiy/p/17531793.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Moyyer_suiy  阅读(67)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起