hdu2191

#include
#include
#include
#include
#include
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>m>>n;
        for(i=1;i<=n;i++)
            cin>>s[i].p>>s[i].w>>s[i].num;
        Dp();
        cout<

多重背包问题

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

模板代码:



你可能感兴趣的:(动态规划)