zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    hduoj1285确定比赛名次
    HDU 1041 Computer Transformation 数学DP题解
    使用Git【转】
    Git-标签管理【转】
    Git-分支管理【转】
    Git-远程仓库【转】
    Git-时光穿梭【转】
    创建版本库【转】
    安装Git【转】
    Git简介【转】
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13541708.html
Copyright © 2011-2022 走看看