#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
模板代码: