• 小球与盒子(组合数学基本模板)


    小球与盒子

    在离散数学里面,组合数是一个重点。下面就对常见的几个小球盒子模型进行总结

    参考了chengni的这篇文章,在此表示感谢。

    注意

    • 以下未说明,均默认球数为n,盒子数为m。
    • (C_{n}^{m}=inom{n}{m}) ,两者是等价的。
    • 从不同变为相同需要乘以阶乘而不是除

    一、球相同,盒子不同,不可以有空盒

    很经典的隔板法模型,相同的物品划分为几个不同的集合。设球为n,盒子为m,方案数为

    [ans= inom{n-1}{m-1} ]

    二、球相同,盒子不同,允许空盒

    这和上面唯一的区别就是允许空盒。不妨假设每个空盒已经被我们放了一个球,那么问题就变成了上面的情况,。所以我们可以看做自己有 n+m 个小球,然后我们在排列完之后在每一组都删去一个小球,这样就能枚举出有空盒的情况了。n个球分成m个集合等价于n+m个球分成m个非空集合。
    于是答案为

    [ans= inom{n+m-1}{m-1} ]

    (在这里把盒子想成集合会好想一些)

    三、球不同,盒子不同,允许空盒

    对于每一个球,你都可以放到1~m的任意位置,所以方案数为

    [ans= m^n ]

    四、球不同,盒子相同,不可以有空盒

    对于这个问题有个东西叫做第二类斯特林数

    在数学上,斯特林数有两类,本文只介绍第二类。

    第二类斯特林数((S2[n][m]))的含义:n 个不同的小球放入m个相同的盒子中(且盒子不能为空)的方案数 。它有个递推公式(S2[i][j]=S2[i-1][j] imes j+S2[i-1][j-1])

    我们可以这样理解:

    1. 如果(i-1)个元素已经构成了(j-1)个集合,那么第(i)个元素单独构成一个集合的方案数为(S2[i-1][j-1] imes 1)(空的集合都是无序相同的,任选一个即可);
    2. 如果(i-1)个元素已经构成了(j)个集合,将第(i)个元素插入到任一个集合中的方案数为(S2[i-1][j] imes j)(选择(j)个集合中的一个有(j)种选法)。

    (在这里把盒子想成集合会好想一些)

    当然,第二类斯特林数还有另一个公式,需要用到容斥。

    [S2[n][m]=frac{1}{m!} imes sum^{m}_{k=0}(-1)^k inom{m}{k} imes (m-k)^n ]

    证明:


    为了方便,不妨假设(A_i)表示第(i)个盒子为空的情况。总方案数为(S),则有

    [S=m^n \ A_i=(m-1)^n ]

    (A_i):对于每个球,都只有(m-1)种选择。所以是((m-1)^n)

    [A_1+A_2+A_3+A_4+cdots+A_m=sum_{i=1}^{m}A_i=m(m-1)^n=inom{m}{1}cdot(m-1)^n ]

    这一个盒子为空的情况,但同时也包含了两个盒子为空的。两个盒子为空的方案数如下

    [sum_{i=1}^{m}sum_{j>i}(A_icap A_j)=inom{m}{2}cdot(m-1)^n ]

    如此推导下去,就可以得出所求第二类斯特林数:

    [S2[i][j]=|ar{A_1}capar{A_2}capcdotscapar{A_m}|\=m^n-sum_{i=1}^{m}|A_i|+sum_{i=1}^{m}sum_{j>i}(A_icap A_j)-cdots+(-1)^{m}|A_1cap A_2capcdotscap A_m|\ =m^n+(-1)cdotinom{m}{1}cdot(m-1)^n+(-1)^2cdotinom{m}{2}cdot (m-2)^n+cdots+(-1)^kinom{m}{k}cdot(m-k)^ncdots\ =sum_{k=0}^{m}inom{m}{k}(m-k) ]

    最后除一个 (m!) 消掉有序性,如果不除就是有序的

    五、球不同,盒子不同,不可以有空盒

    其实就是上一个问题的最后一句话,“如果不除就是有序的。”

    [ans=m!cdot S2[n][m]; ]

    六、球不同,盒子不同,允许空盒

    我们可以枚举每次有几个盒子非空,最后加起来就好了

    [ans=sum_{i=1}^{m}S2[n][i] ]

    七、球相同,盒子也相同,允许空盒

    (f[i][j])表示将(i)个球放到(j)个盒子的方案数

    • 当i < j 时,剩下的j-i个盒子没什么用,所以方案数为(f[i][i])

    • 当i >= j 时

      • 如果将盒子放满,方案数为(f[i-j][j])
      • 如果不把盒子放满,方案数为(f[i][j-1])

    然后就可以(n^2)递推了。

    八、球相同,盒子也相同,无空盒

    先假设每个盒子里都有一个球,所求即(ans=f[n-m][m])

  • 相关阅读:
    HeadFirst Ruby 第七章总结 references
    《HTTP 权威指南》笔记:第三章 HTTP 报文
    HTTP 权威指南 第二章 URL 与资源
    HeadFIrst Ruby 第七章总结 hashes
    HeadFIrst Ruby 第六章总结 block return values
    面向对象的面试题
    属性,类方法,静态方法,Python2和3方法
    类的抽象类接口类,多态封装
    类的继承
    面向对象空间和组合
  • 原文地址:https://www.cnblogs.com/mitnick/p/11838261.html
Copyright © 2020-2023  润新知