0-1背包问题:给定的n种物品和一背包。物品i的重量是Wi,其价值是Vi,背包的容量为C。问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?
【解题思路】
对于物品来说只有两种状态,放或者不放,即1或者0。
求装入背包中物品的总价值最大,即,如果放入第i个物品后背包的总价值比不放入背包后的总价值大,则放入第i个物品,反之则不放。
可以得到
package( i , j ) = Max( package(i-1,j-Wi)+Vi ,package(i-1,j) )
package(i-1,j-Wi)+Vi 表示第i个物品放入背包后背包内物品的总价值
package(i-1,j) 表示第i个物品不放入背包后背包内的总价值
【给定数据】
物品5个
背包容量10
重量:2 2 6 5 4
价值:6 3 5 4 6
【回溯法】
约束条件:W1+W2+……+Wn <= capacity
限界条件:cp+rp>bestp
- 当cp+rp<=bestp时,停止搜索
- cp:当前背包物品总价值
- rp:剩余不知道是否装入背包的物品总价值
- bestp:当前已经搜索到的最优解
//遍历左子树
if(weight >= wei[i])
{
x[i] = 1;
cp = cp+val[i];
rp = rp-val[i];
bug(i+1,weight-wei[i],cp,rp);
//回溯
cp = cp - val[i];
rp = rp + val[i];
}
//遍历右子树
if(cp+rp-val[i] > bestp)
{
x[i] = 0;
rp = rp-val[i];
bug(i+1,weight,cp,rp);
}
return;