这题目很好,给你一个容量为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;
}
}