#include <stdio.h>
#include <string.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int C,n,m,i,j,k;
int s[200],p[200],h[200],c[200];
scanf("%d",&C);
while(C--){
scanf("%d%d",&n,&m);
for(i=0;i<=m-1;i++){
scanf("%d%d%d",&p[i],&h[i],&c[i]);
}
memset(s,0,sizeof(s));
for(i=0;i<=m-1;i++){
for(j=0;j<=c[i]-1;j++){
for(k=n;k>=p[i];k--){
s[k]=max(s[k],s[k-p[i]]+h[i]);
//printf("1111\n");
}
}
}
printf("%d\n",s[n]);
}
return 0;
}
多重背包问题,我这里当做01背包来处理,每种大米有固定的数量,每次选择的时候把一袋大米当做单独的物品来选。
所以在选某一种大米的时候需要加一个循环,长度为c[i]。
现在对于背包问题还是似懂非懂的状态,还好这个题比较简单= =