算法 第五章作业

1.对回溯算法的理解

回溯算法主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。回溯法一般用递归来解决。回溯法中通过构造约束函数,大大地提升程序效率,因为在深度优先搜索的过程中,不断的将每个解与约束函数进行对照从而删除一些不可能的解,这样就不必继续把解的剩余部分列出从而节省部分时间。

回溯算法的编写:1.根据题目条件确定解空间

                             2.确定解空间结构

                             3.以深度优先的策略进行搜索,并确定约束函数以删除一些不可能的解

2.说明“子集和”的解空间结构和约束函数

解空间结构:

if(sum + a[t] <= c)//左树剪枝
    {
        x[t] = 1 ;
        sum = sum+a[t] ;
        if ( backtrack(t+1) )
            return true;
        sum -= a[t];
    }
    if( sum + rest >= c) //右树剪枝
    {
        x[t] = 0 ;
        if ( backtrack(t+1) )
            return true;
    }

约束函数:首先是对左树进行剪枝,即走1与否的剪枝,判断方法为目前的和sum加上当前的a[t]是否大于给定的值,大于的话则不是1;然后是对右树进行剪枝,即走0与否的剪枝,判断方法主要是有一个变量rest表示数列a从t+1开始至后面所有剩下的元素之和,如果目前的和sum加上这个rest小于给定的值,则不是0.

3.本章遇到的问题和结对编程的情况

本章主要学习的是回溯法,针对回溯法最重要的是剪枝的策略,在结对的过程中,我和队友刚开始都比较难理解怎么剪枝,对剪枝的方法还不熟练,后来认真回看了老师上节课的PPT还有别的同学的指导下比较顺利地完成了作业和实验。

猜你喜欢

转载自www.cnblogs.com/VKookie/p/10161978.html