跳转至

球盒问题

约 317 个字 22 行代码 预计阅读时间 1 分钟

n 个球,放入 m 个盒中,共8种情况

球同,盒不同,无空箱

C(n-1,m-1)

使用插板法:n 个球中间有 n-1 个间隙,现在要分成 m 个盒子,而且不能有空箱子,所以只要在 n-1 个间隙选出 m-1 个间隙即可

球同,盒不同,允许空箱

C(n+m-1,m-1)

如果给每个盒子一个球,就可以把问题转化为不能空的情况了,就相当于 n+m 个小球放入 m 个盒子且不能空

球不同,盒相同,无空箱

第二类斯特林数 \begin{Bmatrix}n\\ m\end{Bmatrix}

const int N=5e3+3;
ll S[N][N];
void cal()
{
    S[0][0]=1;
    for(int i=1;i<N;++i)
    {
        for(int j=1;j<=i;++j)
            S[i][j]=S[i-1][j-1]+(ll)j*s[i-1][j];
    }
}

球不同,盒相同,允许空箱

\sum\limits_{i=1}^m\begin{Bmatrix}n\\ i\end{Bmatrix}

枚举使用的箱子的个数

球不同,盒不同,无空箱

m!\times \begin{Bmatrix}n\\ m\end{Bmatrix}

给盒子定义顺序

球不同,盒不同,允许空箱

m^n

每个球都有 m 种选择

球同,盒同,无空箱

等同于把一个正整数n拆分成m个正整数之和的方案数,即分拆数的k部分拆 p(n,m)

const int N=5e3+3;
ll p[N][N];
void cal()
{
    p[0][0]=1;
    for(int i=1;i<N;++i)
    {
        for(int j=1;j<=i;++j)
            p[i][j]=p[i-j][j]+p[i-1][j-1];
    }
}

球同,盒同,允许空箱

等同于把一个正整数拆分成几个正整数之和的方案数,即分拆数 p(n)=\sum\limits_{i=1}^m p(n,i)