回溯法——0-1背包问题

本文介绍了0-1背包问题,通过回溯算法进行求解。算法设计采用深度优先搜索子集树,利用界定函数计算收益上限以优化搜索。以一个实例展示了算法的具体应用,并给出了C++实现的伪代码。算法复杂度为Ω(2^n),适用于解决物品选择优化问题。
摘要由CSDN通过智能技术生成

问题描述

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

算法设计分析

从所有的物品中选取若干将它们装进背包,在满足限制条件的情况下,获得最大的收益。既然要选择一个对象的子集,解空间就应该组织成子集树结构。要设计的递归算法使用深度优先搜索子集树:

​ 对于左孩子,满足限制条件即可;对于右孩子,需要利用界定函数计算此节点的收益上限,即当前节点的收益加上还未考察的对象的收益是否超过当前最优解的收益。如果不是,则不需要搜索右子树。

下面考虑界定函数:

实例:0/1背包问题,当n=3时,w={20,15,15}, p={40,25,25}, c=30,收益密度{2, 5/3, 5/3}。

当以收益密度递减顺序装包时,首先选择对象1,此时剩余容量为10,只能装下2/3的对象2,则生成的解为{1, 2/3, 0},总收益为170/3,虽然这个解不可行(装包量必须是0或1),但可以作为一个界定值,因为它不小于任何一个可行解包括最优解。所以,将对象按收益密度递减顺序排列,能够容易得到界定函数。

算法步骤:

1、将背包装载对象按收益密度递增顺序排序; 
2、对于当前节点currentLevel,判断是否大于对象数,若否,继续下面步骤,反之,算法终止;
3、检查左孩子,若不超过总的容量,左孩子可行,递归左子树;
4、检查右孩子,若有孩子的收益上限大于当前最优解的最大收益,左孩子可行,递归右子树;
上述实例的回溯过程如图:
A ——> B ——> E ——> B ——> A ——> C ——> F ——> L ——> F ——> C ——> A
这里写图片描述

C++实现

定义一个结构element,其数据成员是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值