回溯法之0-1背包问题(算法思路解析)

回溯法解0-1背包问题

问题描述

输入:n件物品的价值和重量{<w1, v1>, <w2, v2>,…, <wn, vn>}和背包容量C

输出:(x1, x2, …, xn),xi∈{0, 1}满足放入的物品重量小于背包容量的前提下价值最大

优化目标:价值最大化

实例讲解

假设:
物品个数为 n=3
背包的容量为 C=30
物品的重量分别为 w={16,15,15}
物品的价值分别为 v={45,25,25}

1.此时的解空间可以为(x1, x2, x3)的所有可能取{(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)}

2.构造解空间树:

在这里插入图片描述
3.遍历解空间(深度优先)

从根往下遍历时,要求每次经过节点都计算此时是否满足容量的条件,当某个分支可以满足重量要求时,记录它的价值总量,以便最后选择最好的价值量。

例如第一次遍历时,经过x1=1,x2=1时,此时重量为31,超过了背包容量,那么我们回溯到x1=1处,并使用剪枝算法的约束函数剪去x2=1这个分支,并遍历x2=0这个分支,再从x2往下拓展x3=1或者0的情况。

概念介绍

扩展结点:一个正在产生儿子的结点称为扩展结点

活结点:一个自身已生成但其儿子还没有全部生成的节点称做活结点

死结点:一个所有儿子已经产生的结点称做死结点

深度优先的问题状态生成法:如果对一个扩展结点R,一旦产生了它的一个儿子C,就把C当做新的扩展结点。在完成对子树C(以C为根的子树)的穷尽搜索之后,将R重新变成扩展结点,继续生成R的下一个儿子(如果存在)

回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法

算法扩展-一般背包问题

在0-1背包中,物品不可拆分,但在一般背包中我们可以将物品拆分,例如将物品1的0.1部分装入背包。

解题思路:

  1. 将物品按照单位重量价值排序。
  2. 先装价值高的,一直到背包装满为止。
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值