第五章作业
第五章作业
1.对回溯算法的理解
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。回溯法求问题的一个解时,只要搜索到问题的一个解就可以结束了。但是搜索一个问题的所有解算法效率较低,回溯法中通过构造约束函数即剪枝来提升程序效率,因为在深度优先搜索的过程中,不断的将每个解(并不一定是完整的,事实上这也就是构造约束函数的意义所在)与约束函数进行对照从而删除一些不可能的解,这样就不必继续把解的剩余部分列出从而节省部分时间。
2.“子集和”问题的解空间结构和约束函数
解空间结构:
“子集和”问题解空间结构类似于0-1背包问题的解空间树,其解空间由长度为n的0-1向量组成,该解空间包含对变量的所有可能的0-1赋值。当n = 5时,其解空间是 { (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),…… ,(1,1,1,1,1)};
约束函数:
1. if( sum + total >= c) //total表示从当前元素加到最后一个元素的总和,利用total来判断剪枝 { x[t] = 0 ; if ( backtrack(t+1) ) return true; } 2. if (total < c || !backtrack(1)) cout << "No Solution!"; //当total小于c时就不需要进行回溯(这里total等于总和)
3.在本章学习过程中遇到的问题及结对编程的情况
对回溯法的算法框架不是很熟悉,主要是在约束函数和限界函数的设计判断上比较难理解。在实验课的时候我和我的队友在解决0-1背包问题上没有得到很好的解决方法,按照我们的思路编程后出来的结果一直都是0或者是出现其他错误,我们对回溯法的理解仍然需要加强。