1.你对回溯算法的理解
回溯算法是以深度优先为策略的有选择性的穷举法。每作出一次选择之后回溯,然后作另外的选择,在不同选择当中选取最优解。约束函数可以减少选择,更快找到最优解。
2.请说明“子集和”问题的解空间结构和约束函数
解空间 { (0, 0, 0, 0, 0), (0, 0, 0, 0, 1), (0, 0, 0, 1, 0), (0, 0, 0, 1, 1), (0, 0, 1, 0, 0), (0, 0, 1, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 1, 1), (0, 1, 0, 0, 0), (0, 1, 0, 0, 1), (0, 1, 0, 1, 0), (0, 1, 0, 1,
1), (0, 1, 1, 0, 0), (0, 1, 1, 0, 1), (0, 1, 1, 1, 0), (0, 1, 1, 1, 1), (1, 0, 0, 0, 0), (1, 0, 0, 0, 1), (1, 0, 0, 1, 0), (1, 0, 0, 1, 1), (1, 0, 1, 0, 0), (1, 0, 1, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 1, 1), (1,
1, 0, 0, 0), (1, 1, 0, 0, 1), (1, 1, 0, 1, 0), (1, 1, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 1, 0, 1), (1, 1, 1, 1, 0), (1, 1, 1, 1, 1) }
0表示不选择,1表示选择
约束函数
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;
}
现在的子集和 + 下一个数字a[t] <= 目标值 选择a[t],回溯
现在的子集和 + 剩余数字之和rest >= 目标值 不选择a[t], 对下一个数字做选择
3.请说明在本章学习过程中遇到的问题及结对编程的情况
对排列树的用法不太熟悉,回溯过程有点难理解,结对编程的时候一起学习排列树的回溯