回溯法(解空间树)求0-1背包问题(全网最简介易懂篇),怎样画解空间树。

注:因为在回溯法画解空间树的方法在概念方面非常、非常、非常的抽象,此处采用通俗易懂的方式进行怎样进行回溯的讲解和解空间树的画法,所以在结构上不是特别严谨,但看完此文并知道如何回溯后,可参考以下博文进行概念方面的加深,以便于更深层次理解。

回溯法——利用解空间树解决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背包问题的回溯很简单,就是你放不放的问题,例如

在第一步即尝试将第一件物品放入背包中,符合背包要求,成功放入。

在第二步尝试将第二件物品放入背包中(此时背包中含有第一件物品),发现重量超过背包的装载量所以此处解不可行,于是我们选择走第三步,右分支,即不放入第二件物品,直接放第三件物品

在第四步,我们尝试将第三件物品放入背包中(此时背包中含有第一件物品),发现重量不符合背包的装载量于是不可解,然后回到上一步,我们直接就放第一个物品所以,最后价值为第一件物品的重量和价值,成功放入。计算完成。

    以此类推,从第一个右分支即表示,直接跳过第一个物品,尝试放第二个物品.......

这样就可以将所有情况推导完,而所谓的回溯即:比如你当前有四个物品,当你在放入第三个物品是可行的时候,你需要将第三个物品拿出,看看放入第四个是否可行呢?于是就会产生分支了。

需要注意的是:右分支中代表的是在当前状态下直接跳过下一个物品,而选择下下一个物品放入,所以当前的重量和价值其实是已经放入的物品的价值和重量,比较拗口,所以看下图:

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 好的,我来一下。 首先,0-1背包问题回溯法空间是一棵二叉,每个节点表示装或者不装当前物品的决策。 当n=3时,我们有3个物品可以选择装或不装,所以初始状态是一棵只有根节点的。 ![image-20210819152219082](https://gitee.com/AmosWong/cdn/raw/master/image-20210819152219082.png) 接下来,我们选择装或不装第一个物品,得到两个子节点。 ![image-20210819152542356](https://gitee.com/AmosWong/cdn/raw/master/image-20210819152542356.png) 然后,在每个子节点的基础上,再选择装或不装第二个物品,继续扩展。 ![image-20210819152843622](https://gitee.com/AmosWong/cdn/raw/master/image-20210819152843622.png) 最后,我们在第三层节点上选择装或不装第三个物品,得到所有的叶子节点。 ![image-20210819153224490](https://gitee.com/AmosWong/cdn/raw/master/image-20210819153224490.png) 每个叶子节点表示一种可能的装包方案,我们需要遍历整棵,计算每个叶子节点对应的总价值,最后输出总价值最大的方案即可。 ### 回答2: 0-1背包问题是一个经典的组合优化问题,假设有一个背包,可以容纳一定的重量,现有n个物品,每个物品的重量和价值不同,要选择一些物品放入背包中,使得背包中的物品总重量不超过背包的容量,且所选物品的总价值最大。 当n=3时,可以将0-1背包问题回溯法空间出如下: (0,0,0) / | \ (0,0,1) (0,1,0) (0,1,1) / \ / \ (0,1,1) (1,1,0) (1,1,1) (0,2,0) / \ / \ (1,1,0) (1,2,0) (1,2,1) (0,3,0) / \ / \ (1,2,0) (1,3,0) (1,3,1) (0,4,0) 在上述的回溯法空间中,每个节点的表示为(已选择的物品总重量,当前处理的物品索引,背包是否被放满)。从根节点开始,根据问题的空间特点,依次选择放入物品或不放入物品。若放入物品使得背包未满且价值最大,则继续向下扩展节点;若不放入物品或放入物品后背包已满,则进入右节点。最终得到所有可能的,其中最优即为找到价值最大的节点。 在绘制该空间时,可以通过设定一个约束条件,如背包中的物品总重量不超过背包容量,来限制的扩展方向,以便排除不满足约束条件的节点。通过回溯法搜索空间,可以找到所有满足约束条件的,并从中选择最优。 注意:上述空间只是一个示意图,并没有考虑具体的背包容量、物品重量和价值。在实际应用中,可以根据具体问题进行调整。 ### 回答3: 0-1背包问题是一个经典的组合优化问题,回溯法是一种常用的决该问题的方法之一。当$n=3$时,我们可以通过回溯法空间决该问题。 回溯法空间是一棵二叉的每个节点代表了问题的一个的状态。根节点表示问题的初始状态,首先将背包容量设满,然后依次考虑每一个物品是否放入背包。 首先,出根节点,背包容量全满: ``` 3/6 / \ / \ 2/4 2/6 ``` 接下来,我们考虑是否将物品1放入背包。如果放入物品1,背包容量将减少物品1的重量,变为3。否则,背包容量不变,仍为6。因此,在根节点的两个子节点上分别标记上物品1以及不放物品1后的背包容量。 接下来,再考虑是否将物品2放入背包。如果放入物品2,背包容量将进一步减少,否则背包容量不变。这样,我们就能得到更多的子节点: ``` 3/6 / \ 2/4 2/6 / \ / \ 1/2 1/4 1/6 0/6 ``` 最后,我们考虑是否将物品3放入背包。同样,如果放入物品3会导致背包容量减少,不放入则容量不变。以此得到更多的子节点: ``` 3/6 / \ 2/4 2/6 / \ / \ 1/2 1/4 1/6 0/6 / \ / \ / \ / \ 1/0 1/4 1/2 1/4 0/6 0/6 0/6 ``` 最终,我们得到一个完整的回溯法空间的每一个叶子节点都代表了问题的一个,通过遍历整个,我们可以找到所有的,并找到最优。 以上就是当$n=3$时的0-1背包问题回溯法空间。通过这个结构,我们可以清晰地展示回溯法决0-1背包问题时的搜索路径和状态变化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值