当球碰到盒子

当球遇上盒子

现在我们开始进入著名的盒子与球问题,来练一练你的排列组合能力。

  • 1.现在有 r r r 个互不相同的盒子和 n n n 个相同的球,要将这 n n n 个球放入 r r r 个盒子中,且不允许有空盒子,问有多少种放法?

我们考虑插板法,可以看成将一个不同的序列分成 r r r 段,则我们需要 r − 1 r-1 r1 个板子,并且供板子插的位置有 n − 1 n-1 n1 个,我们可以得到最终方案为 c n − 1 r − 1 c_{n-1}^{r-1} cn1r1

  • 2.现在有 r r r 个互不相同的盒子和 n n n 个相同的球,要将这 n n n 个球放入 r r r 个盒子中,且允许有空盒子,问有多少种放法?

可以发现,此题与上题的不同之处在于它允许有空盒子。所以,我们可以把这 r r r 个板子当做空球放进去,即只装一个样,而非真正的球。则此时,我们在用 r − 1 r-1 r1 个板子去插,便包含了空盒子的情况。最终方案数: C n + r − 1 r − 1 C_{n+r-1}^{r-1} Cn+r1r1

  • 3.现在有 r r r 个相同的盒子和 n n n 个互不相同的球,要将这 n n n 个球放入 r r r 个盒子中,且不允许有空盒子,问有多少种放法?

此时,我们考虑递推。

我们定义 d p i j dp_{ij} dpij 对应题意,并且这一类神奇的递推又被称作第二类斯特林数

假设你现在正在放第 i i i 个球,有两种情况:单独拿一个盒子装或者随便挑一个盒子放进去。

对于第一种,答案为 d p i − 1 , j − 1 dp_{i-1,j-1} dpi1,j1

对于第二种,答案为 j × d p i − 1 , j j \times dp_{i-1,j} j×dpi1,j

所以 d p i , j = d p i − 1 , j − 1 + j × d p i − 1 , j dp_{i,j} = dp_{i-1,j-1}+j \times dp_{i-1,j} dpi,j=dpi1,j1+j×dpi1,j

特殊情况:只有一个盒子时答案为 1 1 1,球数小于盒子数时答案为 0 0 0

  • 4.现在有 r r r 个相同的盒子和 n n n 个互不相同的球,要将这 n n n 个球放入 r r r 个盒子中,且允许有空盒子,问有多少种放法?

此题跟上题相像,只不过允许了空盒子。我们直接枚举最后有多少个空盒子即可。

最终方案: ∑ i = 1 n d p n , i \sum\limits_{i=1}^n dp_{n,i} i=1ndpn,i

  • 5.现在有 r r r 个互不相同的盒子和 n n n 个互不相同的球,要将这 n n n 个球放入 r r r 个盒子中,且不允许有空盒子,问有多少种放法?

读完题目,发现与第三题仍然很像,只不过盒子从相同变成了不同,所以我们直接在最后乘上 m m m 个盒子的排列即可。

最终方案数: m ! × d p n , r m!\times dp_{n,r} m!×dpn,r

  • 6.现在有 r r r 个互不相同的盒子和 n n n 个互不相同的球,要将这 n n n 个球放入 r r r 个盒子中,且允许有空盒子,问有多少种放法?

我们可以这样看这个问题:对于每一个球,我们都有 r r r 个盒子留给它放,所以最终答案: r n r^n rn

  • 7.把 n n n 个同样的小球放入 m m m 个同样的盒子中,不允许有的盒子空着不放,有多少种不同的放法?

我们再次考虑递推。

我们定义 d p i , j dp_{i,j} dpi,j 表示将 i i i 个小球放入 j j j 个盒子里…(此处省略。)

为了保证没有空盒,我们先往每一个盒子里放一个球。

剩下的我们想第四题一样思考,枚举使用盒子数量。

答案为 ∑ i = 1 n d p n − m , i \sum\limits_{i=1}^{n} dp_{n-m,i} i=1ndpnm,i

特殊情况:当只有一个盒子或球数等于盒子数时,答案为 1 1 1;当球数小于盒子数时,答案为 0 0 0

  • 8.现在有 r r r 个相同的盒子和 n n n 个相同的球,要将这 n n n 个球放入 r r r 个盒子中,且允许有空盒子,问有多少种放法?

我们以第二题和第七题的思路进行思考

考虑转化:先借 m m m 个球铺满每个盒子,求完答案后再把球还回去。

最终答案为 d p n + m , n dp_{n+m,n} dpn+m,n

你可能感兴趣的:(算法总结,学习)