混合背包:三种背包的混合,有的物品只可以取一次(01 背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。
题解:只需要简单的判断下属于什么类型的背包,然后套相应的模板就行
http://codevs.cn/problem/3269/
#include <cstdio>
#include<algorithm>
#include<string.h>
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;
int main()
{
int dp[200010],val[210],vom[210],num[210];
int n,v;
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",vom+i,val+i,num+i);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
if(num[i]==1)
{
for(int j=v;j>=vom[i];j--)
{
dp[j]=Max(dp[j],dp[j-vom[i]]+val[i]);
}
}
else if(num[i]<0)
{
for(int j=vom[i];j<=v;j++)
{
dp[j]=Max(dp[j],dp[j-vom[i]]+val[i]);
}
}
else
{
int dig=num[i],tmp;
for(int k=1;dig>0;k<<=1)
{
tmp=Min(k,dig);
for(int j=v;j>=tmp*vom[i];j--)
{
dp[j]=Max(dp[j],dp[j-tmp*vom[i]]+tmp*val[i]);
}
dig-=k;
}
}
}
printf("%d\n",dp[v]);
}