种苹果,每种都有对应的Size,Value,给你一个背包空间,求最大的价值。
///贪心+背包
/// 先对大容量尽可能装性价比最高的, 然后剩余的容量(比任何单个物品的容量都大) 进行完全背包
///理由
///反证明:假设装了一定个数的性价比最高的东西了,然后剩余的容量进行完全背包,
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<cstring>
#include<cstdio>
using namespace std;
struct node
{
int vi,pi;
double w;
}p[100];
bool cmp(node p1,node p2)
{
return p1.w>p2.w;
}
long long dp[10000];
int main()
{
int n,m,T,v;
while(~scanf("%d",&T))
{
for(int cas=1;cas<=T;cas++)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<3;i++)
{
scanf("%d%d",&p[i].vi,&p[i].pi);
p[i].w=1.0*p[i].pi/p[i].vi;
}
sort(p,p+3,cmp);
scanf("%d",&v);
int newV=v,bignum=0;
long long bigvalue=0;
if(v>1000)
{
newV=v-1000;
bignum=newV/p[0].vi;
newV=v-bignum*p[0].vi;
bigvalue=(long long)bignum*p[0].pi;
}
for(int i=0;i<3;i++)
{
for(int j=p[i].vi;j<=newV;j++)
{
dp[j]=max(dp[j],dp[j-p[i].vi]+p[i].pi);
}
}
printf("Case %d: %lld\n",cas,dp[newV]+bigvalue);
}
}
return 0;
}