Codevs5429 多重背包

来源:互联网 发布:我知女人心迅雷下载 编辑:程序博客网 时间:2024/06/15 06:02

题目:http://codevs.cn/problem/5429/
分析:多重背包题目
代码:

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int Tmax=7005;long long int n,m,f[Tmax];void completepack(long long int v,long long int w){    long long int i;    for(i=v;i<=m;i++)      f[i]=max(f[i],f[i-v]+w);    return;}void zeroonepack(long long int v,long long int w){    long long int i;    for(i=m;i>=v;i--)      f[i]=max(f[i],f[i-v]+w);    return;}void multiplepack(long long int v,long long int w,long long int num){    if(num*v>=m)    {        completepack(v,w);        return;    }    long long int k=1;    while(k<num)    {        zeroonepack(k*v,k*w);        num-=k;        k<<=1;    }    zeroonepack(num*v,num*w);    return;}int main(){    int i;    long long int v,w,c;    scanf("%lld%lld",&n,&m);    for(i=1;i<=n;i++)    {        scanf("%lld%lld%lld",&v,&w,&c);        multiplepack(v,w,c);    }    printf("%lld",f[m]);    return 0;}