算法第五章作业
一、对回溯算法的理解
在我的理解中,回溯法就是把一个问题当作一棵“树”,然后对其进行深度优先的遍历,需要注意的一点就是,每一次往更深一层推进后都要进行“回溯”,即将状态回归到上一层,通过这样的多次遍历,求出其最优解,这就是我理解的回溯算法。
二、“子集和”问题的解空间结构和约束函数
“子集和”问题的解空间结构与“0-1背包”类似,对于有n个可选择的数时,其解空间由长度为n的0-1向量组成,该解空间包含对变量的所有可能的0-1赋值。“1”代表选择该数,“0”代表不选该数。
其约束函数为bound函数,即当其剩下的所有数的和加上已选择的数都不能达到目标值,则对其进行“剪枝”,不再继续遍历。
double bound(int t) { int cleft = c - cw; while (t < n && cleft > 0) { cleft -= a[t]; t++; } return cleft; }
三、在本章学习过程中遇到的问题及结对编程的情况
结对编程情况良好,在互相的学习中彼此都有了长足的进步,并且,由于本次算法期末大作业中,我们选择了回溯法进行完成,更加深了我们对这个算法的理解。