码迷,mamicode.com
首页 > 其他好文 > 详细

回溯法

时间:2019-12-18 23:36:18      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:判断   背包   深度   解决   遇到   处理   整数   编程   效率   

一.对回溯算法的理解

回溯法是一种搜索算法,能搜索一个问题的所有解或者任一解。用回溯法解决问题的步骤如下:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!