HDU - 1521 排列组合——母函数

题意:

有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。

思路:

G(x) = (1+x/1!+x^2/2!+...+x^a1/a1!) * (1 + x/1! + x^2/2! + ... + x^a2/a2!) *...*(1+x/1!+x^2/x!+...+x^an/an!)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
double dp[2][100], jiecheng[100];
int n, m, a[100];
void init() {
    jiecheng[0] = 1;
    for (int i = 1; i <= 10; i++) jiecheng[i] = jiecheng[i-1] * i;
}
int main() {
    init();
    while (~scanf("%d%d", &n, &m)) {
        for (int i = 0; i < n; i++) scanf("%d", &a[i]);
        for (int i = 0; i <= 10; i++) dp[0][i] = dp[1][i] = 0;
        for (int i = 0; i <= a[0]; i++) dp[0][i] = 1.0 / jiecheng[i];
        for (int i = 1; i < n; i++) {
            int pre = (i - 1) % 2, cur = i % 2;
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= a[i] && k <= j; k++) {
                    dp[cur][j] += dp[pre][j-k] / jiecheng[k];
                }
            }
            for (int i = 0; i <= 10; i++) dp[pre][i] = 0;
        }
        printf("%.0lf\n", dp[(n-1)%2][m] * jiecheng[m]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80269178