看这里
当问题变成需要恰好装满背包的时候,初始化dp的时候只要不全部初始化成0.采用dp[0]=0,其他的都设置成负无穷大就可以,因为这样子max(dp[j],dp[j-w]+v)只有取dp[j]的时候才能大于零,代表正好装满。
当问题进一步变化成完全背包问题的时候,只要把双层循环正序更新即可,装满的条件同上。
当问题进一步成为多重背包时,可以考虑二进制优化拆解物品,即假如有5袋w=2,v=2的大米,可以分成1,2,1的数量,即变成了三件物品,然后再对更新过的物品数组进行0,1背包。
scanf("%d%d%d",&p,&h,&k); //p表示价格,h表示重量,k表示大米袋数。
while( k-c>0)
{
k -= c;
lis[++index].w = c*p;
lis[index].v = c*h;
c *= 2;
}
lis[++index].w = p*k; //补充不足指数的差值
lis[index].v = h*k;