HDU-1082 排列组合 普通生成函数 细节

HDU - 1082 排列组合 普通生成函数 细节

HDU 1082 Holding Bin-Laden Captive!

题意

(n_1) 给一元硬币,(n_2)个两元硬币,(n_3) 个5元硬币。从中选择硬币,问能够构成的最小的硬币面值是多少

分析

显然可以从普通生成函数的角度考虑,把生成的面值等价成(x)的指数部分,这里注意的细节是应该先计算出可能的最大价值作为循环的上界。最后遍历一下哪个系数为0就行了。

代码

int c1[10005];
int c2[10005];
int a[3];

int main() {
    while (~scanf("%d%d%d", &a[0], &a[1], &a[2])) {
        if (a[0] == a[1] && a[1] == a[2] && !a[0]) break;
        memset(c1, 0, sizeof c1);
        memset(c2, 0, sizeof c2);
        c1[0] = 1;
        int f;
        int sum = a[0] + 2 * a[1] + 5 * a[2];
        for (int i = 0; i < 3; i++) {
            if (!i) f = 1;
            else if (i == 1) f = 2;
            else f = 5;
            for (int j = 0; j <= sum; j++)
                for (int k = 0; k <= a[i] && (k * f + j) <= sum; k++)
                    c2[j + k * f] += c1[j];
            for (int j = 0; j <= sum; j++) c1[j] = c2[j], c2[j] = 0;
        }
        int ans = -1;
        for (int i = 1; i <= sum; i++) if (!c1[i]) {
            ans = i;
            break;
        }
        printf("%d
", ans);
    }
}
原文地址:https://www.cnblogs.com/hznumqf/p/13541708.html