点击打开链接
种苹果,每种都有对应的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; }