HDU - 1085 Holding Bin-Laden Captive! ——母函数

题意:

有三种硬币面值分别为1 2 5, 给定每种硬币的数量,问用这些硬币不能组成的最小面值是多少

思路:

因为每个硬币有个数限制,但是也不难构造出

G(x)=(1+x+x^2+...+x^num1)(1+x^2+x^4+...+x^2*num2)(1+x^5+x^10+...+x^5*num5)

将多项式展开后, xi 项对应的系数就是组成面值为i的方案数
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e4;
const int val[5] = {1, 2, 5};
int num[5];
int V, dp[2][maxn];
int main() {
    while (~scanf("%d%d%d",&num[0],&num[1],&num[2]) && (num[0]+num[1]+num[2])) {
        V = 0;
        for (int i = 0; i < 3; i++) V += num[i] * val[i];
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i <= num[0]; i++) dp[0][i] = 1;
        for (int i = 1; i <= 2; i++) {
            int pre = (i-1)%2, cur = i%2;
            for (int j = 0; j <= V; j++) {
                if (!dp[pre][j]) continue;
                for (int k = 0; k <= num[i] * val[i]; k += val[i]) {
                    if (j + k <= V) dp[cur][j+k] += dp[pre][j];
                }
            }
        }
        int ans;
        for (ans = 0; ans <= V; ans++) {
            if (!dp[0][ans]) break;
        }
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80264674
今日推荐