【模板】盒子与球

Description

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

Input

n, r(0 <= n, r <= 1000)。

Output

有多少种放法。

Sample Input

3 2

Sample Output

6

分析: 每个盒子都要放,不能直接用组合数来算.设f[i][j]表示i个求放到前j个盒子的方案数,i可以放在一个新的盒子里或者放在之前的盒子里,有j种选择,那么f[i][j] = f[i-1][j-1] + f[i-1][j] * j,这样求出来的方案数只是每个位置放多少个球的方案数.因为盒子有编号,最后还要乘上r!

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

int n, r, f[1010][1010], sum[1010];

int main()
{
    scanf("%d%d", &n, &r);
    sum[1] = 1;
    for (int i = 2; i <= r; i++)
        sum[i] = sum[i - 1] * i;
    f[0][0] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= r; j++)
            f[i][j] = f[i - 1][j - 1] + f[i - 1][j] * j;
    printf("%d\n", f[n][r] * sum[r]);

    return 0;
}

 

posted @ 2017-12-02 10:29  zbtrs  阅读(277)  评论(0编辑  收藏  举报