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

点击打开链接

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


你可能感兴趣的:(SDUT 2408 Pick apples 贪心+背包(大容量背包))