Zombie's Treasure Chest(UVA - 12325 )

Zombie’s Treasure Chest

紫书第210页;

这道题非常有意思,第一眼看上去以为是01背包,但是体积可以1e9,说明不是背包;

看书上解析,发现这种暴力方法,或者说根本不是暴力,实在太过于巧妙了;

两种物品,最简单的方法枚举一种,计算另外一种,但是当n/s1或者n/s2都非常大时,这个算法明显就不行了;

这时可以比较s2v1和s1v2的大小,取s2个一号物品,s1个二号物品,所用体积都相同,如果s2v1>s1v2,说明二号物品最多只能取s1-1个,如果取大于等于s1个,那么为什么不取s2个一号物品呢?

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
#define inf 0x3f3f3f3f
//ios::sync_with_stdio(false);
using namespace std;
const int N=200100;
const int M=1000100;
const LL mod=998244353;
int main(){
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	int ans=0;
	while(t--){
		LL n,s1,v1,s2,v2;
		cin>>n>>s1>>v1>>s2>>v2;
		LL mmax=0LL;
		if(n/s1>=1e5&&n/s2>=1e5){
			if(s2*v1>s1*v2){//v2最多s1-1个 
				for(int i=s1-1;i>=0;i--){
					LL sum=(LL)i*v2+(n-(LL)i*s2)/s1*v1;
					mmax=max(mmax,sum);
				}
			}
			else{//v1最多s2-1个 
				for(int i=s2-1;i>=0;i--){
					LL sum=(LL)i*v1+(n-(LL)i*s1)/s2*v2;
					mmax=max(mmax,sum);
				}
			}
		}
		else if(s1>s2){
			for(int i=0;i<=n/s1;i++){
				LL sum=(LL)i*v1+(n-(LL)i*s1)/s2*v2;
				mmax=max(mmax,sum);
			}
		}
		else{
			for(int i=0;i<=n/s2;i++){
				LL sum=(LL)i*v2+(n-(LL)i*s2)/s1*v1;
				mmax=max(mmax,sum);
			}
		}
		cout<<"Case #"<<++ans<<": "<<mmax<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值