zoukankan      html  css  js  c++  java
  • HDU4091:Zombie’s Treasure Chest (分类-数学)

    题意:给两种宝石,体积S1,S2,价值V1,V2,背包容量n,求最大收益。 所有数据都在32位整数范围内。

    思路:只有两种物品的背包,显然不是常见的背包,应该从背包之外的思路下手。

    1:可以猜想其中一个是数量少于1e5,暴力求,然后过了。

    2:分类处理数据: 如果有物品体积>=sqrt(N),那么可以枚举它的数量[0,N/S];

                                   不然,对于性价比低的那一个,它的数量t,和性价比高的那个的体积S的关系是t<=S。

    #include<bits/stdc++.h>
    #define s first
    #define e second
    #define rep(i,a,b) for(ll i=a;i<=b;i++)
    #define rep2(i,a,b) for(int i=a;i>=b;i--)
    #define ll long long
    using namespace std;
    int main()
    {
        int T,C=0; ll S,S1,V1,S2,V2,ans;
        scanf("%d",&T);
        while(T--){
            scanf("%lld%lld%lld%lld%lld",&S,&S1,&V1,&S2,&V2);
            printf("Case #%d: ",++C); ans=0;
            if(S1<=S2&&V1>=V2) ans=max(ans,(S/S1)*V1);
            if(S2<=S1&&V2>=V1) ans=max(ans,(S/S2)*V2);
            if(S1*S1>=S){
                rep(i,0,S/S1)
                  ans=max(ans,V1*i+(S-S1*i)/S2*V2);
            }
            if(S2*S2>=S){
                rep(i,0,S/S2)
                  ans=max(ans,V2*i+(S-S2*i)/S1*V1);
            }
            if(S1*S1<S&&S2*S2<S){
                rep(i,0,max(S1,S2)){
                    if(S>=S1*i) ans=max(ans,V1*i+(S-S1*i)/S2*V2);
                    if(S>=S2*i) ans=max(ans,V2*i+(S-S2*i)/S1*V1);
                }
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    PSR-2 编码风格规范
    Git中删除冗余的分支
    linux下ssh连接缓慢详解
    pytest框架之fixture详细使用
    如何利用jenkins插件查看allure报告-----完整篇
    CentOS上安装配置Python3.7
    [Python]requests使用代理
    Selenium
    Python性能分析工具-cProfile
    subprocessf运行window程序
  • 原文地址:https://www.cnblogs.com/hua-dong/p/11181826.html
Copyright © 2011-2022 走看看