一、对回溯法的理解:
在采用回溯法解决实际问题之前,要先构造一颗解空间树,然后按照深度优先的策略进行搜索。所以使用回溯法的时候要先明确定义好问题的解空间(解空间树是一个抽象的概念,在代码中不给予实现)。回溯的灵魂在于遍历,回溯法在求问题的一个解时,只要搜索到问题的一个解即可结束;但如果回溯法用以求问题的所有解,那么要回溯到根结点且根结点的所有子树都要被搜索过才可结束。但回溯法在解决规模较大的问题的时候,如果只是单纯的搜索,时间复杂度过高,所以我们需要通过假如剪枝函数来提高搜索效率。提高效率的难点就在于剪枝函数的剪枝条件,所以在编程时要认真考虑。
二、“子集和”问题的解空间结构和约束函数:
”子集和“问题类似于0-1背包问题,"子集和“问题的解空间由长度为n的0-1向量组成,该解空间包含对所有变量的所有可能的0-1赋值。比如当n=5时,其解空间为{(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)}。其解空间树是一颗完全二叉树。
其约束函数为 if (sum + a[t] < c)/ else ,如果加上当前结点的值小于问题所要求的子集和目标值,则向左子树走,否则走向右子树。
三、本章学习过程中遇到的问题和结对编程情况汇报:
本章学习对我来说难点在于比较难以想到约束函数和限界函数,通常在编程过程中会发现自己做的不是回溯法,然后就要在停顿一会儿,去思考,比较费时间。结对编程上的话,最近一段时间也比较忙于各种小测和期末的大作业、复习等等,虽然有交流,但是交流的次数比之前少了,自己在回溯法上也要多下功夫。