《动态规划》hdoj 2191 多重背包模版题 二进制优化

#include<stdio.h>


int max(int x,int y)
{
    return x>y?x:y;
}
int main()
{int dp[105];
int w[505],v[505];
    int c,num,n,m,i,j,a,s,p,k;
    scanf("%d",&c);
    while(c--)
    {
        memset(dp,0,sizeof(dp));
        num=0;
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&s,&p);
            k=1;
            while(k<=p)
            {
                num++;
                w[num]=a*k;
                v[num]=s*k;
                p-=k;
                k*=2;
            }
            if(p)
            {
                num++;
                w[num]=a*p;
                v[num]=s*p;
            }
        }
        for(j=1;j<=num;j++)
        {
            for(i=n;i>=w[j];i--)
            {
                dp[i]=max(dp[i],dp[i-w[j]]+v[j]);
            }
        }
        printf("%d\n",dp[n]);
    }
}

你可能感兴趣的:(《动态规划》hdoj 2191 多重背包模版题 二进制优化)