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