代码改变世界

回溯法解0/1背包问题

2013-08-22 14:34  youxin  阅读(980)  评论(0编辑  收藏  举报

我们前面说过,贪心算法用价值重量比对于可分割的背包问题是有效的,但对于0/1背包问题就无效的(0/1背包是不能分割,要就要,不要就不要)。本节用回溯法解0/1背包问题,求解过程如下:

 

 

在搜索过程中,尽量沿着左儿子节点前进,当不能沿着左儿子节点继续前进时,就得到问题的一个部分解,并把搜索转移到

右儿子子树。此时,估计由这个部分解所能得到的最大价值,把该值与当前的上界进行比较,如果高于当前的上界,就继续

由右儿子子树向下搜索,扩大这个部分解,直到找到一个可行解,最后把可行解保存起来,用当前可行解的值刷新目标函数的

上界,并向上回溯,寻找其他可能解;如果有部分所估计的最大值小于当前的上界,就丢弃正在搜索的部分解,直接向上回溯。

 

向上回溯有2种情况:如果当前阶段是左儿子分支节点,就转而搜索相应的右儿子分支节点;如果当前的节点是右儿子分支节点,

就沿着右儿子分支节点向上回溯,直到左儿子分支节点为止,然后再转而搜索相应的右儿子分支节点