回溯法理解

回溯法

基本思想:

构建问题的解空间树,在其解空间树中,从根节点出发,进行深度优先搜索。在搜索过程中,对解空间

树的每个结点进行判断,判断该结点是否包含问题的解,若肯定不包含,则跳过对以该结点为根的子树的

搜索,逐层向其祖先结点回溯。否则,则进入该子树,继续按深度优先策略搜索。

步骤:

1、针对所给问题,定义其解空间

2、确定易于搜索的解空间结构

3、深度优先搜索其解空间,并在搜索过程中用剪枝函数避免无效搜索

剪枝:

回溯法搜索空间树时,常用限界函数和约束函数避免无效搜索,其中约束函数将不满足约束的子树剪去,

限界函数将得不到最优解的子树。一般可以利用这两种剪枝方式提升算法的效率,避免大量的不必要搜索。

常见解空间:

常见的解空间有子集树和排列树两种,当问题是从n个元素的集合S中找到满足某种性质的s的子集时,相应的

解空间为子集树,通常存在2n个叶结点。0-1背包的问题相应解空间即为子集树。当问题是确定n个元素的满足

某种性质的序列时,相应的解空间树为排列树通常有n!个叶结点。旅行售货问题的解空间即为排列树。

个人理解:

学习了回溯法后,个人感觉回溯法就是通过对解空间的遍历,在解空间不断更新答案,最后找到最优的结果。

回溯法最主要的是三点,一是构造问题的解空间,不同问题的解空间不同,同一个问题也可以构造不同的解空间,

最适合的解空间是便通过于搜索找到答案的一种。二是搜索策略,回溯法用的是深度优先搜索策略,在回溯是需要

注意对一些变量的处理操作。三是剪枝,剪枝是回溯法的精髓所在,通过剪枝去掉大量不必要的搜索可以大幅的提

高算法的效率,因此回溯法构造合理的剪枝方式可以决定算法的优劣,十分重要。

例题说明:

7-1 子集和问题

问题描述:存在一个正整数集合S={x1,x2,…,xn},c是一个整数,判读S是否存在一个子集s1,子集的和等于c

//输入
5 10                //5个数字的集合S   c为10
2 2 6 5 4
//输出
2 2 6         

解空间:

子集和问题的解空间为子集树结构。其中子集树的每一层表示是否选择该数值。

约束函数:

当递归的层数大于等于n时,表示当前层次已经大于元素的个数,接下来的为无用搜索,直接剪去该

结点的搜索即可当搜索到当前结点后所得的值大于题目中的c,则表示接下来的搜索不可能找到等于c的

答案,直接剪去以该节为根的子树的搜索即可。

if(i>=n||c<ans)    //ans为遍历到该节点时,所选择的元素的和
    return;              

if(ans+a[i]<=c)    //第i个元素是否加入子集
if(ans<=c)    

结对编程以及学习心得:

在本章学习中,了解了回溯法的基本用法,对于大部分的题目中,都可以利用回溯法来解出他的答案,主要

难点是构造解空间和搜索时的剪枝的方法,剪枝的方法会影响到算法的最终效率,需要多加考虑。在本次结对编程

中,还是存在一些小问题,对同一题的不同想法等,在不断的交流中加深了对回溯法的理解,对学习理解有一定的帮助促进效果。

原文地址:https://www.cnblogs.com/LjwCarrot/p/10134870.html

时间: 2024-10-12 17:31:57

回溯法理解的相关文章

回溯法之八皇后问题简单理解

回溯法,简单理解就是有源可溯.基本思想要借鉴穷举法,但是它不是一味地穷举,当发现某一步不符合条件时,这一步后面的穷举操作就不进行了(俗称“剪枝”),我自己把它叫做动态穷举法.假设第一个步骤可行,那么执行第二个步骤,第三个......如果其中第三个步骤不行,那么我们再回过来(回溯),第二个步骤换一种方法尝试,然后再重新第三个步骤,第四个......直到完成任务要求为止. 这里,以八皇后问题为例.试图把回溯法讲清楚. 注意:递归应该是一种算法结构,回溯法是一种算法思想. 何为八皇后问题? (百度百科

张三木教你理解回溯法

回溯法 回溯法(搜索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择.这种走不通就退回再走的技术为回溯法.而满足回溯条件的某个状态的点称为"回溯点". 回溯法问题的框架 问题的解空间 复杂问题常常有很多的可能解,这些可能的解构成了问题的解空间.解空间就是进行穷举的搜索空间,所以解空间中应该包含所有的可能解,且至少应该包含问题的一个最优解.例如:对于有n个物品的0/1背包问题,当n=3时,其解

回溯法-01背包问题之一:递归模式

一.回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解.如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯.否则,进入该子树,继续按深度优先的策略进行搜索. 运用回溯法解题通常包含以下三个步骤: · 针对所给问题,定义问题的解空间: · 确定易于搜索的解空间结构: · 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函

基于回溯法寻找哈密顿回路

回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”. 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树.当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯(其实回溯法就是对隐式图的深度优先搜索算法). 若用

回溯法、数独与N阶可达问题(一)

回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经定了),最终到达美利坚(任意一个城市).而城市之间有可能不可达,只有小明尝试过才知道(就是后面的check()函数),求满足要求的一条路径? 从上面的表述中我们已经嗅到了浓浓的穷举屌丝气质——遍历所有组合,但是我们的回溯思想总是基于这样一个简单的事实:如果当前选择导致你走进了死胡同,那么这个选择一定

回溯法第3题—n皇后问题

[问题描述] 在一个国际棋盘上,放置n个皇后(n<10),使她们相互之间不能进攻.求出所有布局. 输入:n 输出:每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数之间用空格隔开. [样例输入] 4 [样例输出] 2 4 1 3 2 1 4 2 [问题分析] 我想这大概是回溯法最经典的一个问题了吧,开一个函数判断一下当前位置是否能放即可. 这里有一个小技巧,就是对皇后进行编号,对应着数组的下标,就可以很容易的满足第一个条件——所有皇后不能在同一行上. 然后数组元素则代表皇后所在的列数,满足

回溯法:找回遗失的创造力

今天非常高兴可以听高老师的讲座,因为我跟高老师有渊源(当然是我认识他,他不认识我).我毕业后的第一份工作中有一小段时间在做Android手机应用的开发,那时Android正盛, 网上资料铺天盖地,但良莠不齐,想我在初出茅庐软件思想还不健全的情况下要找到一份通俗易懂并且靠谱的参考资料实在很困难.但非常幸运的是,我发现了高涣堂老师写的几本书,虽然内容不是很多但讲得非常清晰.那时正在自学设计模式,自认"满腹经纶却无用武之地",而他的书恰好弥补了我在实践方面的不足.我是个吃了鸡蛋,就想看看下蛋

回溯法与树的遍历

关于回溯法和DFS做下总结: 在程序设计中有一类题目求一组解或者求全部解或者求最优解等系列问题,不是根据某种特定的规则来计算,而是通过试探和回溯的搜索来查找结果,通常都会设计为递归形式. 这类题本身是一颗状态树,当只有两种情况的时候则为二叉树,这棵树不是之前建立的,而是隐含在遍历过程中的.接下来根据一些题目来提高认识. 一.二叉状态树 题目: 说白了就是一个全遍历的过程,找出每一种可能的组合.对于123则有题目中的8种情况. 思路: 这样的全排列问题可以从元素本身入手,每一个元素只有两种状态,被

回溯法与分支限界

回溯法 1.有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法. 2.回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法.这种方法适用于解一些组合数相当大的问题. 3.回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解.如果肯定不包含(剪枝过程),则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯:否则,进入该子树,继续按深度优先策略搜索. 问