洛谷题单指南-组合数学与计数-P1287 盒子与球

原题链接:https://www.luogu.com.cn/problem/P1287

题意解读:n个不同的球放入r个不同盒子的方案数

解题思路:

1、第二类斯特林数

用于解决n个不同的球放入r个相同盒子的方案数,不同盒子乘上r!即可。

可以用递推实现斯特林数,

设s[i][j]表示i个不同球放入j个相同盒子的方案数,

考虑第i个球的方法:

放入一个新盒子:s[i][j] = s[i-1][j-1]

放入前n-1个球所放的j个盒子:s[i][j] = s[i-1][j] * j,乘上j是因为有j个盒子可选

根据加法原理:s[i][j] = s[i-1][j-1] + s[i-1][j] * j

初始状态:s[0][0] = 1

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 15;

int n, r, s[N][N];

int main()
{
    cin >> n >> r;
    s[0][0] = 1;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= r; j++)
            s[i][j] = s[i - 1][j - 1] + s[i - 1][j] * j;

    int ans = s[n][r];
    for(int i = 1; i <= r; i++) ans *= i;
    cout << ans << endl;
    
    return 0;
}

 

posted @ 2025-11-14 17:48  hackerchef  阅读(3)  评论(0)    收藏  举报