• 【模板】盒子与球


    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
    ", f[n][r] * sum[r]);
    
        return 0;
    }
  • 相关阅读:
    CodeForces 656B
    时间限制
    哈哈
    &1的用法
    codeforces 385 c
    hdu 1176 免费馅饼
    poj 1114 完全背包 dp
    poj 1115 Lifting the Stone 计算多边形的中心
    jar包解压
    重定向
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7953547.html
Copyright © 2020-2023  润新知