zoukankan      html  css  js  c++  java
  • 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 imes S2 = S2 imes 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("");
        }
    }
    
    
  • 相关阅读:
    C#线程同步(1)- 临界区&Lock
    详细解析Java中抽象类和接口的区别
    防止重复提交的几种办法
    网页中实现JSON的编辑与显示
    xcode5 ios7升级后的一系列问题解决
    hadoop-2.0.0-mr1-cdh4.2.0源码编译总结
    hadoop-2.0.0-cdh4.2.1源码编译总结
    cocos2d-iphone加入芒果广告
    hadoop2.0 eclipse 源码编译
    HBase学习笔记
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13646694.html
Copyright © 2011-2022 走看看