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