HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

多重背包模板题

 

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, dp[105];
struct Dami
{
   int v, w, d;
} ri[105];
void deal(int x)
{
    int i;
    if(ri[x].d*ri[x].v>=n)
    {
        for(i=ri[x].v;i<=n;i++)
            dp[i]=max(dp[i],dp[i-ri[x].v]+ri[x].w);
    }
    else
    {
        int k=1;
        while(k<ri[x].d)
        {
            for(i=n;i>=ri[x].v*k;i--)
                dp[i]=max(dp[i-ri[x].v*k]+ri[x].w*k,dp[i]);
            ri[x].d-=k;
            k*=2;
        }
        for(i=n;i>=ri[x].v*ri[x].d;i--)
        {
            dp[i]=max(dp[i-ri[x].v*ri[x].d]+ri[x].w*ri[x].d,dp[i]);
        }
    }
}
int main()
{
    int T, m, i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(dp,0,sizeof(dp));
        for(i=0;i<m;i++)
            scanf("%d%d%d",&ri[i].v,&ri[i].w,&ri[i].d);
        for(i=0;i<m;i++)
            deal(i);
        printf("%d\n",dp[n]);
    }
    return 0;
}


 

posted @ 2013-08-19 18:55  Ink_syk  阅读(157)  评论(0编辑  收藏  举报