回溯法和分支限界法解决 0-1 背包题(14页)Good is good, but better carries it.精益求精,善益求善。0-1 背包问题计科 1 班 朱润华 2025040732方法 1:回溯法一、回溯法描述:用回溯法解问题时,应明确定义问题的解空间。问题的解空间至少包含问题的一个(最优)解。对于 0-1 背包问题,解空间由长度为 n 的 0-1 向量组成。该解空间包含对变量的所有 0-1 赋值。例如 n=3 时,解空间为: {(0,0,0),(0,1,0),(0,0,1),(1,0,0),(0,1,1),(1,0,1),(1,1,0),(1,1,1)} 然后可将解空间组织成树或图的形式,0-1 背包则可用完全二叉树表示其解空间给定 n 种物品和一背包。物品 i 的重量是 wi,其价值为 vi,背包的容量为 C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?形式化描述:给定 c >0, wi >0, vi >0 , 1≤i≤n.要求找一 n 元向量(x1,x2,…,xn,), xi∈{0,1}, ? ∑ wi xi≤c,且∑ vi xi 达最大.即一个特别的整数规划问题。二、回溯法步骤思想描述:0-1 背包问题是子集选取问题。0-1 背包问题的解空间可以用子集树表示。在搜索解空间树时,只要其左儿子节点是一个可行节点,搜索就进入左子树。当右子树中有可能含有最优解时,才进入右子树搜索。否则,将右子树剪去。设 r 是当前剩余物品价值总和,cp 是当前价值;bestp 是当前最优价值。当cp+r<=bestp 时,可剪去右子树。计算右子树上界的更好的方法是将剩余物品依次按其单位价值排序,然后依次装入物品,直至装不下时,再装入物品一部分而装满背包。例如:对于 0-1 背包问题的一个实例,n=4,c=7,p=[9,10,7,4],w=[3,5,2,1]。这 4 个物品的单位重量价值分别为[3,2,3,5,4]。以物品单位重量价值的递减序装入物品。先装入物品 4,然后装入物品 3 和 1.装入这 3 个物品后,剩余的背包容量为 1,只能装 0.2 的物品 2。由此得一个解为[1,0.2,1,1],其相应价值为 22。尽管这不是一个可行解,但可以证明其价值是最优值的上界。因此,对于这个实例,最优值不超过 22。在实现时,由 Bound 计算当前节点处的上界。类 Knap 的数据成员记录解空间树中的节点信息,以减少参数传递调用所需要的栈空间。在解空间树的当前扩展节点处,仅要进入右子树时才计算上界 Bound,以推断是否可将右子树剪去。进入左子树时不需要计算上界,因为上界预期父节点的上界相同。三、回溯法实现...