第五章作业

1.     对回溯算法的理解

回溯法是按深度优先策略,从根结点出发搜索解空间树,如果某结点不包含解,则跳过以该结点为根的子树,逐层向祖先结点回溯;当求问题的一个解时,只要搜索到问题的一个解就可结束,当求问题最优解时,系统地搜索问题的所有解,比较找出最优解。回溯法有两种提高搜索效率的策略,一是使用约束函数剪去不满足约束的函数,二是使用限界函数剪去得不到最优解的函数。

2.     子集和问题

(1)     解空间:{x1,x2,x3……xn},xi为0或1,xi=0时表示不选,xi=1时表示选择,其结构为一棵二叉树,每一层代表一个数,左子树表示选择,右子树表示不选择。

(2)     约束函数:if(cnum+a[i]<=c),当前的子集和加上该元素不能超过限定数,否则舍去

回溯过程为:

bool Backtrack(int i)
{
    if(cnum==c)
        return true;
    if(i>n)
        return false;
    rest-=a[i];   
    if(cnum+a[i]<=c){
        b[i]=1;
        cnum+=a[i];    
        if(Backtrack(i+1))
           return true;
        cnum-=a[i];
    }
    if(cnum+rest>=c)
    {
        b[i]=0;
        if(Backtrack(i+1))
            return true;
    }
    rest+=a[i];
    return false;
}

3.     问题及结对编程情况

学习过程中理解回溯法的原理,但不太了解一步步回溯的过程。后来通过画图理解了,如果要自己独立打出完整代码还需多练习。我向队友讨教的比较多,学到不少,效果良好。

 

posted @ 2018-12-23 13:56  L莹T  阅读(125)  评论(0编辑  收藏  举报