算法第5章作业

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

  回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。回溯法求问题的所有解时,要回溯到跟,且根结点的所有子树都已被搜索遍才结束。求问题的一个解时,只要搜索到问题的一个解就可结束。

  基本步骤:

    (1)用回溯法解问题时,应明确定义问题的解空间。解空间至少应包含问题的一个(最优)解。

    (2)将解空间组织成树或图的形式

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

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

  设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法。

  

  解空间:是否选择当前元素。

  约束函数:保证  sum+a[t]<=c。(a[ t ]为当前元素值,sum为该元素前的子集和)

bool backtrack(int t){
    if (sum==c) 
        return true;
    if (t>=n)
        return false;
    rest-=a[t];
    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;
    }
    rest+=a[t];
    return false;
}

 

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

  实践过程中,发现我们对剪枝函数的理解并不透彻,什么时候使用剪枝函数,不是很了解,请教了同学后才明白。

posted @ 2018-12-23 13:57  lasia_LWL  阅读(233)  评论(0)    收藏  举报