林思婷

导航

算法第五章作业

一:对回溯算法的理解

回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。

策略:回溯法在问题的解空间数中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其组先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

回溯法的基本步骤:

(1)针对所给问题,定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

常用的剪枝函数:

(1)约束函数:在扩展结点处剪去不满足约束的子树;

(2)限界函数:剪去得不到最优解的子树;

 

二:说明“子集和”问题的解空间结构和约束函数

解空间结构:

约束函数:代码中m>c为一约束函数,表示如果当前子集和已超过所要的数,则不继续搜索。

void BackTracks(int m,int id){
    if(m > c){//约束函数
        return;
    }
    if(isOkey){
        return;
    }
    for(int i = id; i < n; ++i){
        list[len++]=x[i];
        if(x[i] + sum == c){
            isOkey = true;
            return;
        }
        else{
            sum += x[i];
            BackTracks(sum,i+1);
            if(isOkey){
                break;
            }
            sum -= x[i];
            --len;
        }
    }
}

三:说明在本章学习过程中遇到的问题及结对编程的情况

本章学习的过程之中了解了回溯法的基本套路,解决问题相对容易一些,也仔细琢磨了临界函数。但队友似乎对临界函数不是很懂,于是我帮他理解了一下临界函数,终于有一次是我领先了嘻嘻。

posted on 2018-12-21 16:42  林思婷  阅读(282)  评论(0编辑  收藏  举报