给你一个体积n的箱子和两种宝物 宝物体积分别为s1 s2,价值分别为v1 v2 问怎么塞能让价值最大。
很容易想到枚举宝物1然后求宝物2,或者倒过来。但是当两个的体积都很小时枚举量就会很大。
所以分成三种情况:1、s1较大 2、s2较大 3、s1 s2都较小
1,2两种情况可以通过前行判断交换位置转换为一种情况,即直接枚举就行。
对于三,就利用贪心的思想:拿s2件1和s1件2的体积都是s1*s2 如果前面大 说明2最多只能拿s1-1个(能拿s1以上个数的话,换成1价值更高),反过来同理。利用这个就能优化。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
int main()
{
int kase=0;
int T,V,S1,V1,S2,V2;
cin>>T;
LL ans=0;
while(T--)
{
ans=0;
cin>>V>>S1>>V1>>S2>>V2;
if(S1>S2)//交换位置 使S1<S2
{
swap(S1,S2);
swap(V1,V2);
}
if(V/S2>=65532) //S2较小,则S1一定较小
{
for(LL i=0;i<=S2;i++)
ans=max(ans,i*V1+(V-i*S1)/S2*V2);
for(LL i=0;i<=S1;i++)
ans=max(ans,i*V2+(V-i*S2)/S1*V1);
}
else// S2较大的情况
{
for(LL i=0;i*S2<=V;i++)
ans=max(ans,V2*i+(V-S2*i)/S1*V1);
}
printf("Case #%d: %lld\n",++kase,ans);
}
return 0;
}