多重背包模板

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[150];

void x01back(int w,int v,int W)
{
    for(int i=W;i>=w;i--){
        dp[i]=max(dp[i],dp[i-w]+v);
    }
}

void multiback(int w,int v,int num,int W)
{
    if(w*num>=W){
        for(int i=w;i<=W;i++){
            dp[i]=max(dp[i],dp[i-w]+v);
        }
    }
    else{
        for(int i=1;i<num;i<<=1){
            x01back(w*i,v*i,W);
            num-=i;
        }
        x01back(num*w,num*v,W);

    }
}

int main()
{
    int T;
    int n,m;
    int w[108],v[108],num[108];
    scanf("%d",&T);
    while(T--){
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&w[i],&v[i],&num[i]);
        }
        for(int i=1;i<=n;i++){
            multiback(w[i],v[i],num[i],m);
        }
        printf("%d\n",dp[m]);
    }
}

  

posted @ 2018-08-03 16:04  断腿三郎  阅读(97)  评论(0编辑  收藏  举报