【模板】盒子与球
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; }