第五章作业

  1. 你对回溯算法的理解(2分)

基本思想:

构建问题的解空间树,在其解空间树中,从根节点出发,进行深度优先搜索。在搜索过程中,对解空间

树的每个结点进行判断,判断该结点是否包含问题的解,若肯定不包含,则跳过对以该结点为根的子树的

搜索,逐层向其祖先结点回溯。否则,则进入该子树,继续按深度优先策略搜索。

回溯法的精髓在于剪枝,常用限界函数或者约束函数减少时间,其中约束函数将不满足约束的子树剪去,限界函数将得不到最优解的子树。

        2.请说明“子集和”问题的解空间结构和约束函数(2分)

约束函数:

当递归的层数大于等于n时,表示当前层次已经大于元素的个数,接下来的为无用搜索,直接剪去该

结点的搜索即可当搜索到当前结点后所得的值大于题目中的c,则表示接下来的搜索不可能找到等于c的

答案,直接剪去以该节为根的子树的搜索即可

if(i>=n||c<ans)    //ans为遍历到该节点时,所选择的元素的和
    return;              

if(ans+a[i]<=c)    //第i个元素是否加入子集
if(ans<=c)    

 

有子集树和排列树这两种。前者是但所有的问题是从n个元素的集合中找出满足某种性质的子集时,相应的解空间树成为子集树。后者当所给出问题是确定n个元素满足某种性质的排列时,相应的解空间称为排列树。

旅行者问题和0-1背包问题是这两种树的经典题目

剪枝回溯法搜索空间树时,常用限界函数和约束函数避免无效搜索,其中约束函数将不满足约束的子树剪去,

限界函数将得不到最优解的子树。一般可以利用这两种剪枝方式提升算法的效率,避免大量的不必要搜索。

        3.  请说明在本章学习过程中遇到的问题及结对编程的情况(1分)

0-1背包问题为了方便预算上界,会将物品按照单位重量价值排序。这个排序会比较难想出来,后来各方面学习懂得了可以用结构体和bool一个函数来进行排序,解决了这个问题。

结对编程没什么问题,一起学习挺好的。

posted on 2018-12-20 19:41  赖锐杰  阅读(144)  评论(0)    收藏  举报

导航