Loading

UVA-12325 Zombie's Treasure Chest 思维,枚举

UVA-12325 Zombie's Treasure Chest 思维,枚举

题意

现有一个体积为\(N\)的箱子和两种数量无限的宝物。宝物1的体积为\(S1\) ,价值为\(V1\) ,宝物2的体积为\(S2\) ,价值为\(V2\)

保证输入均为32位带符号整数。

给出能够装纳的最大价值。

分析

直接背包,复杂度肯定不对。

特殊性质在于只有两个物品,考虑贪心的选择。

若$N / S1 $ 比较小,在枚举范围内,那么直接枚举宝物1的数量。

\(N/S2\) 比较小,在枚举范围内,那么直接枚举宝物2的数量。

\(N / S1 and N / S2\) 都比较大,说明\(S1,S2\) 比较小。

由于\(S1 \times S2 = S2 \times S1\)

这说明我们会贪心的选择性价比较高的。这表明还是可以把枚举量控制在S内。

代码

vconst ll N = 1e5;

int main() {
    int T = readint();
    int kase = 1;
    while (T--) {
        ll res = 0;
        ll n = readll();
        ll s1 = readll(), v1 = readll(), s2 = readll(), v2 = readll();
        swap(s1, v1);
        swap(s2, v2);
        if (n / v1 <= N) {
            for (ll i = 0; i <= n / v1; i++)
                res = max(res, i * s1 + (n - v1 * i) / v2 * s2);
        }
        else if (n / v2 <= N) {
            for (ll i = 0; i <= n / v2; i++)
                res = max(res, i * s2 + (n - v2 * i) / v1 * s1);
        }
        else {
            for (ll i = 0; i < v1; i++)
                res = max(res, i * s2 + (n - i * v2) / v1 * s1);
            for (ll i = 0; i < v2; i++)
                res = max(res, i * s1 + (n - i * v1) / v2 * s2);
        }
        printf("Case #%d: ", kase++);
        Put(res);
        puts("");
    }
}

posted @ 2020-09-10 16:48  MQFLLY  阅读(153)  评论(0编辑  收藏  举报