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. 问题及结对编程情况
学习过程中理解回溯法的原理,但不太了解一步步回溯的过程。后来通过画图理解了,如果要自己独立打出完整代码还需多练习。我向队友讨教的比较多,学到不少,效果良好。