hdu2191

来源:互联网 发布:梅西生涯数据 编辑:程序博客网 时间:2024/04/29 12:29

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;int dp[1100];int m,n;struct node{    int p;    int w;    int num;};node s[110];//01背包void zeroOne(int cost,int value){    for(int i=m;i>=cost;i--)        dp[i]=max(dp[i],dp[i-cost]+value);}//完全背包void complete(int cost,int value){    for(int i=cost;i<=m;i++)        dp[i]=max(dp[i],dp[i-cost]+value);}//多重背包void multi(int cost,int value,int amount){    int k=1;    if(cost*amount>=m)        complete(cost,value);    else    {        while(amount>=k)        {            zeroOne(k*cost,k*value);            amount-=k;            k*=2;        }        zeroOne(amount*cost,amount*value);    }}void Dp(){    for(int i=1;i<=n;i++)    {        multi(s[i].p,s[i].w,s[i].num);    }}int main(){    int T;    int i,j,k1;    cin>>T;    for(k1=0;k1<T;k1++)    {        memset(dp,0,sizeof(dp));        cin>>m>>n;        for(i=1;i<=n;i++)            cin>>s[i].p>>s[i].w>>s[i].num;        Dp();        cout<<dp[m]<<endl;    }    return 0;}

多重背包问题

参考网址:http://blog.sina.com.cn/s/blog_6ad683a10100uvwi.html

模板代码:



原创粉丝点击