Uva12325 Zombie's Treasure Chest【分类枚举】【例题7-11】

来源:互联网 发布:幼儿园美工活动反思 编辑:程序博客网 时间:2024/05/20 19:15

题目:Zombie's Treasure Chest

题意:有一个体积为N的箱子和两种数量无限的宝物。 宝物1的体积为S1,价值为V1;宝物2的体积为S2,价值为V2你的任务是计算最多能装多大价值的宝物。

思路:分俩种情况枚举:

枚举1:当s1或s2的体积很大(即n/s1  n/s2 很小)时,枚举较大体积的那个宝物即可。

枚举2:当s1和s2的体积很小,但N又很大时,此时按枚举1来就超时了,由题可得:S2个宝物1S1个宝物2的体积相等,而价值分别为S2*V1S1*V2。所以当前者较大时,宝物2最多s1-1个,因为以上的条件可知,当体积相等的条件下宝物1的价值大,所以宝物2不能再超出那个范围了,这样宝物1就不能放到最大化,总价值就不是最大化。后者较大时同理。 所以将俩种宝物都枚举后取最大的。

参考:入门经典-例7-11-P210 + 紫书代码库

代码:

#include <iostream>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 65536;inline ll fun(ll tal,ll n,ll s1,ll s2,ll v1,ll v2){    ll ans = 0;    for(ll i=0;i<=n;i++) ans = max(ans,i*v2 + (tal-s2*i)/s1 * v1);return ans;}int main(){    ll T,n,s1,s2,v1,v2,ans,kcase = 1;    scanf("%lld",&T);    while(T--){        scanf("%lld%lld%lld%lld%lld",&n,&s1,&v1,&s2,&v2);        if( s1 > s2) swap(s1,s2),swap(v1,v2);//s2作为较大的        if((double)n / s2 > maxn) ans = max(fun(n,s1,s1,s2,v1,v2),fun(n,s2,s2,s1,v2,v1));//俩个都很小        else ans = fun(n,n/s2,s1,s2,v1,v2);//        printf("Case #%lld: %lld\n",kcase++,ans);    }    return 0;}



0 0