Loading

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\n", ans);
    }
}
posted @ 2020-08-21 16:25  MQFLLY  阅读(99)  评论(0编辑  收藏  举报