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

hdu2191: http://acm.hdu.edu.cn/showproblem.php?pid=2191
题意:容量为v的背包,有n种物品,每种物品时有限个的,有不同体积及价值,求最大价值 解法:多重背包
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
int v[200],w[200],c[200],f[200];
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int t,n,m,i,j,k,x;
    scanf("%d",&t);
    for(int y=0;y<t;y++)
    {
        memset(f,0,sizeof(f));
        scanf("%d%d",&n,&m);
        for(j=0;j<m;j++)
            scanf("%d%d%d",&v[j],&w[j],&c[j]);
        for(i=0;i<m;i++)
        {
            if(v[i]*c[i]>n)         //可看成完全背包
            {
                for(j=v[i];j<=n;j++)             //顺序 
                    f[j]=max(f[j],f[j-v[i]]+w[i]);
            }
            else
            {
                for(k=1;c[i]>k;k=k*2)            //二进制的思想,分为若干个价值为k*v[i]的物品,再01背包
                {
                    for(j=n;j>=k*v[i];j--)             //逆序 
                        f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
                    c[i]=c[i]-k;
                }
                for(j=n;j>=c[i]*v[i];j--)
                    f[j]=max(f[j],f[j-c[i]*v[i]]+c[i]*w[i]);
            }
        }
        printf("%d\n",f[n]);
    }
}
/*
input:
1            //case数
8 2          //经费、大米种类 
2 100 4      //价格、重量、袋数
4 100 2
output:
400         //最大重量
*/

posted on 2012-07-26 11:54  acmer-jun  阅读(202)  评论(0编辑  收藏  举报

导航