注:因为在回溯法画解空间树的方法在概念方面非常、非常、非常的抽象,此处采用通俗易懂的方式进行怎样进行回溯的讲解和解空间树的画法,所以在结构上不是特别严谨,但看完此文并知道如何回溯后,可参考以下博文进行概念方面的加深,以便于更深层次理解。
回溯法——利用解空间树解决0-1背包问题_回溯法求解01背包约束条件-CSDN博客
由于直接描述过程比较抽象,因此直接上例题
例题:假设N=3(有三件物品),三个物品的重量为{20,15,10},三个物品的价值为{20,30,25},对于一个最大承重为25的背包,求包中物品的组合最大的价值是多少?
题目的参考思路图如下,建议图文对照:(参考书为王红梅老师的《算法设计与分析》)
对三件物品分别进行编号1,2,3,初始情况背包是空的
1.首先我们把1号物品放进背包里,此时背包里只有一件物品,总重量为0+20=20,没有超过承重25,因此可以将1号物品成功放入背包内;
2.接下来尝试把2号物品放入背包内,但是发现包中1号物品和2号物品的重量和为20+15=35,超过了承重25,因此不能把2号物品放入背包内;
3.接着考虑3号物品,此时包中只有1号物品。发现1号物品和3号物品的重量和为20+10=30,超过了承重25,因此3号物品也不能放入背包内;
4.由于只有3件物品,并且对于每一种物品我们都考虑过是否将其放入背包内,也就是找到了一种基本情况。找到一个基本情况后,我们就可以看看包里的物品的总价值了。这里包里只有一个1号物品,因此总价值为20;
5.重点来了!回溯过程:每次找出一种满足条件的基本情况就进行一次回溯,找到最后放入包中的物品并将其取出,接着考虑是否放入编号在这个物品之后的第一个物品。这里我们就把1号物品取出,接下来考虑是否放入2号物品;
6.取出1号物品后背包是空的,此时如果放入2号物品,背包总重量为15,没有超过背包承重,因此把2号物品放入背包内;
7.类似地,考虑将3号物品放入背包内。由于2号物品和3号物品的重量和为15+10=25,没有超过承重25,因此将其放入背包内;
8.由于考虑完了3号物品,因此又找到了一个基本情况,记下此时包里物品的总价值,为30+25=55。由于55高于上一种基本情况的总价值,因此将最优解更新为55
简单总结:所谓关于0-1背包问题的回溯很简单,就是你放不放的问题,例如
在第一步即尝试将第一件物品放入背包中,符合背包要求,成功放入。
在第二步尝试将第二件物品放入背包中(此时背包中含有第一件物品),发现重量超过背包的装载量所以此处解不可行,于是我们选择走第三步,右分支,即不放入第二件物品,直接放第三件物品
在第四步,我们尝试将第三件物品放入背包中(此时背包中含有第一件物品),发现重量不符合背包的装载量于是不可解,然后回到上一步,我们直接就放第一个物品所以,最后价值为第一件物品的重量和价值,成功放入。计算完成。
以此类推,从第一个右分支即表示,直接跳过第一个物品,尝试放第二个物品.......
这样就可以将所有情况推导完,而所谓的回溯即:比如你当前有四个物品,当你在放入第三个物品是可行的时候,你需要将第三个物品拿出,看看放入第四个是否可行呢?于是就会产生分支了。
需要注意的是:右分支中代表的是在当前状态下直接跳过下一个物品,而选择下下一个物品放入,所以当前的重量和价值其实是已经放入的物品的价值和重量,比较拗口,所以看下图: