题目:混合背包
思路:
和多重背包几乎一样,就是在p==0时把数量改成inf就可以了。
加个滚动数组。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxm 6000
#define maxn 500
int m,n;
int w[maxn+5],c[maxn+5],num[maxn+5];
int f[maxm+5]= {0};
int main() {
scanf("%d%d",&m,&n);
for(int i=1; i<=n; i++) {
scanf("%d%d%d",&w[i],&c[i],&num[i]);
if(num[i]==0) num[i]=(1<<30);
for(int j=m; j>=0; j--) {
for(int k=1; j-k*w[i]>=0&&k<=num[i]; k++) {
f[j]=max(f[j],f[j-k*w[i]]+k*c[i]);
}
}
}
printf("%d\n",f[m]);
return 0;
}