7-11Zombie's Treasure Chest uva12325

题意  你有一个体积为N的箱子和两种数量无限的宝物  宝物1的体积为s1 价值为v1   宝物2同理

输入均为32位带符号整数  

你的任务是计算最多能带走多少价值的宝物 

暴力枚举:

首先明白一点      如果s1<s2  则枚举 s2    枚举量为n/s2  更小  

                          如果s1>s2  则枚举s1     枚举量为n/s1 更小

假如   s1和s2 都很小的时候     这种枚举方式 枚举量就会很大

此时有一种枚举方式可以将枚举量减少到MAX{s1 s2}

s2个宝物1 和s1个宝物2的体积相同     假若前者的价值更高    那么宝物二的数量一定小于s1   不然的  假设大于等于s1   那么s1个宝物2可以用s2个宝物1来代换 价值肯定更高  所以枚举量为s1即可

#include<bits/stdc++.h>
using  namespace std;


typedef long long LL;
int main()
{
    int n,v1,s1,v2,s2;
    int cas;
    cin>>cas;
    for(int k=1;k<=cas;k++)
    {
        cin>>n>>s1>>v1>>s2>>v2;
        if(s1>s2)
        {
            swap(s1,s2);
            swap(v1,v2);
        }
        //使得s1<s2;
      LL ans=0;
      if(n/s2>=65536)
        {
            if( s2*v1<s1*v2 )
              swap(v1,v2),swap(s1,s2);

            for(LL i = 0; i <= s1; i++)
                ans = max(ans, v2*i + (n-s2*i)/s1*v1);
        }
        else
            for(LL i=0;i*s2<=n;i++)
                 ans=max( ans,i*v2+(n-i*s2)/s1*v1) ;

        printf("Case #%d: %lld
",k,ans);
    }
}
原文地址:https://www.cnblogs.com/bxd123/p/10411111.html