TYVJ 4354 多重背包二进制优化

直接放代码了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int Case,m,n,k,f[666666],xx,yy,zz,tot,w[666666],v[666666];
int main()
{
    scanf("%d",&Case);
    while(Case--)
    {
        memset(f,0,sizeof(f));
        memset(w,0,sizeof(w));
        memset(v,0,sizeof(v));
        tot=0;
        scanf("%d%d%d",&m,&n,&k);//(小吃的种类量 需要的填充值 可以使用的钱)
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&xx,&yy,&zz);//x,y,z(第i种小吃的价钱,数量,填充值)
            int t=1;
            while(yy>=t)
            {
                tot++;
                yy=yy-t;
                w[tot]=t*xx;      //w[] 表示花的钱 
                v[tot]=t*zz;      //v[]表示填充值 
                t*=2;
            }
            tot++;
            w[tot]=yy*xx;
            v[tot]=yy*zz;
        }
        for(int i=1;i<=tot;i++){
            for(int j=k;j>=w[i];j--)
            f[j]=max(f[j],f[j-w[i]]+v[i]);
        }
        if(n-f[k]>0)printf("%d\n",n-f[k]);
        else printf("YES\n");
    }
}

貌似目前只有两个人过了,另一个还是管理员
这里写图片描述

posted @ 2016-03-06 16:27  SiriusRen  阅读(89)  评论(0编辑  收藏  举报