题目大意:我觉得不用说了,题目已经很明显了。
鉴于01背包和完全背包已经写过了,这次只说多重背包了。利用2进制思想分解,01背包又考虑了某件物品选与不选的情况,这样就成功将问题转化了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,v,f[200005];
int main()
{
memset(f,0,sizeof(f));
scanf("%d%d",&n,&v);
while (n--)
{
int m,w,flag;
scanf("%d%d%d",&m,&w,&flag);
if (flag==1)
{
for (int i=v;i>=m;--i)
f[i]=max(f[i],f[i-m]+w);
}
else if (flag==-1)
{
for (int i=m;i<=v;++i)
f[i]=max(f[i],f[i-m]+w);
}
else
{
if (flag*m>=v)
{
for (int i=m;i<=v;++i)
f[i]=max(f[i],f[i-m]+w);
}
else
{
int k=1;
while (k<flag)
{
for (int i=v;i>=k*m;--i)
f[i]=max(f[i],f[i-k*m]+k*w);
flag-=k;
k*=2;
}
for (int i=v;i>=flag*m;--i)
f[i]=max(f[i],f[i-flag*m]+flag*w);
}
}
}
printf("%d",f[v]);
return 0;
}