HDU4091 Zombie’s Treasure Chest 好数论一道

这题目很好,给你一个容量为n的容器,然后两种宝物,一种体积s1,价值v1,还有一种s2,v2,问最多能装的宝物总价值,就是用两种宝物去填充,由于我语文水平太差,无法表达,还是直接贴代码把,一看代码保证就懂啊,语文真心差,本来想转别人题解的,可是一看差不多 大家语文都差 还是这道题目分析不好表示呢


#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>

#define ll long long
#define LL __int64
#define eps 1e-8

#define inf 0xfffffff

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p;
//

#define IN freopen("c:\\Users\\linzuojun\\desktop\\input.txt", "r", stdin)
#define OUT freopen("c:\\Users\\linzuojun\\desktop\\output.txt", "w", stdout)

LL Gcd(LL a,LL b)
{
	return b?Gcd(b,a%b):a;
}

LL Lcm(LL a,LL b)
{
	return a/Gcd(a,b)*b;
}

int main(void)
{
	int t;
	int Case=0;
	LL n,s1,v1,s2,v2;
	cin>>t;
	while(t--)
	{
		cin>>n>>s1>>v1>>s2>>v2;
		LL lcm=Lcm(s1,s2);
		LL r=n%lcm;
		LL ans=0;
		if(s1<s2)
		{
			LL temp=s1;
			s1=s2;
			s2=temp;
			temp=v1;
			v1=v2;
			v2=temp;
		}
		if(n/lcm == 0)//容器容量小于两种宝物的最小公倍数
			for(int i=0;i<=r/s1;i++)//暴力枚举每一种填充的情况
				ans=max(ans,i*v1+(r-i*s1)/s2*v2);
		else
		{
			for(int i=0;i<=(r+lcm)/s1;i++)//同样也是暴力枚举,但是由于容器容量大于等于最小公倍数,所以还有部分剩余空间可利用,要加上
				ans=max(ans,i*v1+(r+lcm-i*s1)/s2*v2);
			ans+=(n-lcm)/lcm*max(lcm/s1*v1,lcm/s2*v2);  
		}
		cout<<"Case #"<<++Case<<": "<<ans<<endl;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值