SDUT 2408 Pick apples 贪心+背包(大容量背包)

来源:互联网 发布:淘宝女装代发货源 编辑:程序博客网 时间:2024/06/07 01:57

点击打开链接

种苹果,每种都有对应的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;}


0 0