不用二进制优化也可以AC 就是01背包的方法
这里按PPT优化了 部分空间和时间复杂度从O(n)降低至O(log2(n))
#include<stdio.h>
int f[101],v[500],c[500],t,n,m,p,h,x,C,cnt,i,j;
int main(){//每种大米最多20袋 二进制优化占5位 至多100种 数组开500足够
scanf("%d",&C);
while(C--){
scanf("%d%d",&n,&m);cnt=0;
while(m--){
scanf("%d%d%d",&p,&h,&x);t=1;
while(x>t){
v[cnt]=p*t;
c[cnt++]=h*t;
x-=t;
t<<=1;
}
v[cnt]=p*x;
c[cnt++]=h*x;
}
for(j=0;j<=n;++j)f[j]=0;
for(i=0;i<cnt;i++)
for(j=n;j>=v[i];j--)
if(f[j-v[i]]+c[i]>f[j])//与01背包一样 只是经过分块的物品可能相同
f[j]=f[j-v[i]]+c[i];
printf("%d\n",f[n]);
}
}