0-1背包问题的回溯算法可以像以往的回溯算法一样一层一层的寻找,但查看限界函数Bound(i)时,如果Bound(i)<bestv则停止搜索第i层节点及其子树,否则继续搜索。显然r(i)越小,bound(i)越小,剪去的分支就会越多,为了构建更少的r(i),,将物品以单位重量价值降序排列,对于第i层背包的剩余容量,采用贪心算法把剩余的物品放入背包,此时剩余物品的价值是最优的,因为对于剩余物品不存在比上述贪心算法最优的
回溯算法:
void backtrack(int i){
if(i+1>n) {bestv=cv; return;
}
if(cw+Q[i].w<c){
cw+=Q[i].w;
cv+=Q[i].v;
backtrack(i+1);
cw-=Q[i].w;
cv-=Q[i].v;
}
if(Bound(i+1)>bestv) backtrack(i+1);
}
贪心算法
double Bound(int i){
int cleft=c-cw;
int b=cv;
while(i<n&&cleft=>Q[i].w){
cleft-=Q[i].w;
b+=Q[i].v;
i++;
}
if(i<n) b+=cleft*Q[i].d;
return b;
}