2017.10.2 计算机算法分析----0-1背包问题

回溯算法的要点:

1,针对所给问题,定义问题的解空间。

2,确定容易搜索的解空间的组织结构。

3,通过剪枝优化搜索过程。

下面通过求解0/1背包问题来分析使用回溯算法的过程:

1,根据问题的描述,设所有的物件数是N,对应的重量和价值分别为w[0~N-1]和v[0~N-1],于是这个问题就转化成在这N件物件中选择一个子集,使其总价值最大,并且满足总重量不超过包的容量cw。因此此问题的解空间是2^n。

2,对于从n个元素的集合S中求满足某种性质的子集时,相应的子空间成为子集树,这类子集树通常是满完全二叉树,通过遍历这棵树的每个叶子节点来达到遍历整个解空间的目的,相应的时间复杂度为O(2^n)。

3,对于背包问题的剪枝函数,可以从以下两方面考虑:

(1)根据题目要求,选择物件的总重量不能超过包的容积,这可以作为一个剪枝条件。用Constraint(t)函数表示在遍历子集树第t层某个节点时,此约束函数是否满足,如不满足,则剪去相应的子树。

(2)第二种剪枝函数称为边界函数Bound(t),当它返回true时,表示当前遍历节点未取得最优值,需要进一步搜索子树。

posted @ 2017-10-02 23:00  LegendQi  阅读(373)  评论(0编辑  收藏  举报