【专题】组合数学之球盒问题

球盒问题是组合数学中的经典问题,问题统一一下就是这样:
n n n 个(不)同的球,放进 m m m 个(不)同的盒子里,(不)允许有空盒,求方案数。

根据上面的描述可以看出,这个问题总共有 8 8 8 种情况,我们一个一个来看。为了方便起见,我们只考虑有解的情况

  • 球相同,盒不同,无空盒

    C n − 1 m − 1 C_{n - 1}^{m - 1} Cn1m1

    可以用插板法, n n n 个球中总共有 n − 1 n - 1 n1 个空隙,根据条件,我们只需要在 n − 1 n - 1 n1 个空隙中插 m − 1 m-1 m1 个板子即可。

  • 球相同,盒不同,有空盒

    C n + m − 1 m − 1 C_{n + m - 1}^{m - 1} Cn+m1m1

    既然允许有空盒,那么我们可以多加 m m m 个“虚”的球,预先塞进每个盒子。

    这样问题就化归成了有 n + m n + m n+m 个相同的球和 m m m 个不同的盒子,不允许有空盒的情况,直接运用上面的结论就可以解决问题了。

  • 球不同,盒相同,无空盒

    d ( n , m ) = d ( n − 1 , m − 1 ) + m × d ( n − 1 , m ) , m < n d(n, m) = d(n - 1, m - 1) + m \times d(n - 1,m) ,m < n d(n,m)=d(n1,m1)+m×d(n1,m),m<n

    边界条件 d ( k , k ) = 1 d(k, k)=1 d(k,k)=1 d ( k , 0 ) = 0 d(k, 0)=0 d(k,0)=0

    考虑DP

    d ( n , m ) d(n, m) d(n,m) 表示已经放了 n n n 个球,放进了 m m m 个盒子(非空)的方案数。

    对于第 n n n 个球,如果之前的 n − 1 n - 1 n1 个球已经放在了 m m m 个盒子里,那么第 n n n 个球就可以随便放在这 m m m 个盒子中(因为我没有新开一个盒子),那么答案就是 m × d ( n − 1 , m ) m \times d(n - 1, m) m×d(n1,m)

    另外,如果我是新开了一个盒子,那么只有一种可能,答案是 d ( n − 1 , m − 1 ) d(n - 1, m - 1) d(n1,m1)

    顺便说一句,其实敏感的读者已经发现了,这就是第二类斯特林数。

  • 球不同,盒相同,有空盒

    ∑ i = 0 m d ( n , i ) \sum_{i=0}^{m} d(n, i) i=0md(n,i) d d d 状态转移方程同上一种情况

    其实允许空盒就是可以不用把 m m m 个盒子全部用完,那么就直接在上一种情况的基础上枚举实际用到的盒子的个数,将答案累加起来就可以了。

  • 球不同,盒不同,无空盒

    m ! × d ( n , m ) m! \times d(n, m) m!×d(n,m)

    较第三种情况就多了盒的有序性,处理方法也很简单,给盒子标个号, A m m A_m^m Amm 打乱一下即可。

  • 球不同,盒不同,有空盒

    m n m^n mn

    这大概是最简单的一种情况了吧,每个球都有 m m m 个位子可以放,根据乘法原理,答案就是 m n m^n mn

  • 球相同,盒相同,有空盒

    d ( n , m ) = d ( n , m − 1 ) + d ( n − m , m ) , m ≤ n d(n, m)=d(n, m - 1) + d(n - m, m), m \leq n d(n,m)=d(n,m1)+d(nm,m),mn

    d ( n , m ) = d ( n , m − 1 ) , m > n d(n, m) = d(n, m - 1), m > n d(n,m)=d(n,m1),m>n

    边界条件 d ( k , 1 ) = 1 , d ( 1 , k ) = 1 , d ( 0 , k ) = 1 d(k, 1)=1,d(1,k)=1,d(0, k)=1 d(k,1)=1,d(1,k)=1,d(0,k)=1

    还是考虑DP,但是和第二类斯特林数搭不上边了,倒是和自然数拆分有点相似。

    和之前相似的定义, d ( n , m ) d(n, m) d(n,m) 表示已放进 n n n 个球,有 m m m 个盒子。

    考虑小球比盒子多时,可以选择将盘子不放满或者放满分别对应 d ( n , m − 1 ) d(n, m - 1) d(n,m1) d ( n − m , m ) d(n - m, m) d(nm,m)

    但小球比盒子少时,已经不存在放满的情况了,直接 d ( n , m − 1 ) d(n, m - 1) d(n,m1)

  • 球相同,盒相同,无空盒

    d ( n − m , m ) d(n - m, m) d(nm,m) d d d 状态转移方程同上一种情况。

    由于球相同,我们可以想到一个简便的办法化归到上一种情况:实现给每个盒子底部先垫一个球,接下来就是上一种情况了。

以上就是对 8 8 8 种情况的讨论,可以看出,其中用到的化归思想的地方比较多,要熟练掌握的话需要对其中各个模型的联系相当熟悉。

你可能感兴趣的:(排列组合)