算法第五章作业
一:对回溯算法的理解
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。
策略:回溯法在问题的解空间数中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其组先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
回溯法的基本步骤:
(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; } } }
三:说明在本章学习过程中遇到的问题及结对编程的情况
本章学习的过程之中了解了回溯法的基本套路,解决问题相对容易一些,也仔细琢磨了临界函数。但队友似乎对临界函数不是很懂,于是我帮他理解了一下临界函数,终于有一次是我领先了嘻嘻。