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;
}
posted @ 2025-06-13 09:11  fzrcy  阅读(17)  评论(0)    收藏  举报