一.对回溯算法的理解
回溯法是一种搜索算法,能搜索一个问题的所有解或者任一解。用回溯法解决问题的步骤如下:
1.确定问题的解空间
2.确定易于搜索的解空间结构
3.以深度优先方式搜索解空间,找到问题的所有解或者任一解,在搜索过程中用用剪枝函数来避免无效搜索。
子集树和排列树是两种解空间树,当问题是从n个元素的集合中找出满足某种性质的子集时,相应的解空间树为子集树(二叉树),如0-1 背包问题和子集和问题;当问题是要确定n个元素的某种排列时,其解空间树为排列树,如旅行售货员问题。
从树的根节点按深度优先方法搜索解空间树时,每个结点代表一种状态,当搜索至任意结点时,先判断该结点是否包含问题的解,若不包含,则跳过该结点,向其祖先结点回溯;若包含,则继续搜索该结点的子树。
二.“子集和”问题的解空间结构和约束函数
问题描述:设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法。
其解空间为集合S的一个子集。可用子集树表示,从根结点开始,第 i 层表示的状态为第 i 个数是否包含在子集中。
约束函数为:在子集中加入某元素后当前子集中的元素之和是否小于c,小于则将该元素加入子集中。
三.学习中遇到的问题及结对编程情况
约束函数和限界函数的设置是一个重点也可以算是一个难点吧,处理得好可以很好得提高算法的效率,但练习得比较少特别是限界函数,很可能在这一处出错。
结对编程还算好,没出现什么大问题,每次都是相互学习的过程。
原文地址:https://www.cnblogs.com/Jettle/p/12064382.html