文件名称:算法分析之 0_1背包问题回溯法
文件大小:1.03MB
文件格式:ZIP
更新时间:2016-02-09 05:57:32
0_1背包问题 回溯法
用回溯法解0_1背包问题时,会用到状态空间树。在搜索状态空间树时,只要其左儿子结点是一个可行结点,搜索就进入其左子树。当右子树有可能包含最优解时才进入右子树搜索,否则将右子树剪去。设r是当前剩余物品价值总和;cp是当前价值;bestp是当前最优价值。当cp+r≤bestp时,可剪去右子树。计算右子树中解的上界可以用的方法是将剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入该物品的一部分而装满背包。由此得到的价值是右子树中解的上界,用此值来剪枝。 为了便于计算上界,可先将物品依其单位重量价值从大到小排序,此后只要顺序考察各物品即可。在实现时,由MaxBoundary函数计算当前结点处的上界。它是类Knap的私有成员。Knap的其他成员记录了解空间树种的节点信息,以减少函数参数的传递以及递归调用时所需要的栈空间。在解空间树的当前扩展结点处,仅当要进入右子树时才计算上界函数MaxBoundary,以判断是否可以将右子树减去。进入左子树时不需要计算上界,因为其上界与父结点的上界相同。 在调用函数Knapsack之前,需要先将各物品依其单位重量价值从达到小排序。为此目的,我们定义了类Objiect。其中,运算符与通常的定义相反,其目的是为了方便调用已有的排序算法。在通常情况下,排序算法将待排序元素从小到大排序。 在搜索状态空间树时,由函数Backtrack控制。在函数中是利用递归调用的方法实现了空间树的搜索
【文件预览】:
0_1背包回溯法
----0_1背包回溯法.opt(48KB)
----0_1背包回溯法.dsw(551B)
----0_1背包回溯法.ncb(41KB)
----0_1背包回溯法.cpp(3KB)
----0_1背包回溯法.dsp(3KB)
----0_1背包回溯法.plg(773B)
----Debug()
--------0_1背包回溯法.exe(536KB)
--------vc60.idb(73KB)
--------0_1背包回溯法.pdb(1.05MB)
--------vc60.pdb(108KB)
--------0_1背包回溯法.obj(248KB)
--------0_1背包回溯法.ilk(770KB)
--------0_1背包回溯法.pch(1.91MB)