- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0-1 背包问题
计科 1 班 朱润华 2012040732
方法 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, 以判断是否可将右子树剪去。进入左子树时不需要计算上界,因
为上界预期父节点的上界相同。
三、回溯法实现代码:
#include stdafx.h
#include iostream
using namespace std;
templateclass Typew,class Typep
class Knap
{
templateclass Typew,class Typep
friend Typep Knapsack(Typep [],Typew [],Typew,int);
private:
Typep Bound(int i);
void Backtrack(int i);
Typew c; // 背包容量
int n; // 物品数
Typew *w; // 物品重量数组
Typ
文档评论(0)