UVA12325 宝箱 Zombie's Treasure Chest
你有一个体积为N的箱子和两种数量无限的宝物。
宝物1的体积为S1,价值为V1:;宝物2的体积为S2,价值为V2。
输入均为32位带符号整数。
计算最多能装多大价值的宝物。(每种宝物都必须拿非负整数个)。
A:我们可以用枚举法计算。
当 S1 或 S2 较大时直接枚举其中一个的个数即可,\(O(\min\{n/S_1,n/S_2\})\)
当 S1、S2 较小时,若 \(\frac{V1}{S1}>\frac{V2}{S2}\) 时,若选了 \(S1\) 个宝物二时,可以用 \(S2\) 个宝物一替代。所以宝物二最多选 \(S1-1\) 个。复杂度 \(O(\min\{S1,S2\})\)。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
int T;scanf("%d",&T);
for(int idx=1;idx<=T;idx++){
LL n,S1,V1,S2,V2,ans=0; // S->value V->volume
scanf("%lld %lld %lld %lld %lld",&n,&V1,&S1,&V2,&S2);
if(V1*V1>=n){
LL x,y,t=n/V1;
for(x=0;x<=t;x++)y=(n-V1*x)/V2,ans=max(ans,x*S1+y*S2);
}
else if(V2*V2>=n){
LL x,y,t=n/V2;
for(x=0;x<=t;x++)y=(n-V2*x)/V1,ans=max(ans,x*S2+y*S1);
}
else{
if(S1*V2>S2*V1)swap(S1,S2),swap(V1,V2); LL x,y;
for(x=0;x*V1<=n&&x<V2;x++)y=(n-x*V1)/V2,ans=max(x*S1+y*S2,ans);
}
printf("Case #%d: %lld\n",idx,ans);
}
return 0;
}

浙公网安备 33010602011771号