![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯法
壹零叁玖
多多重复 百炼成钢
展开
-
回溯法之子集和问题
问题描述找到数组中加和等于目标值的几个数字并输出(不可重复)。题目分析典型的回溯法,解空间为子集树。这道题与0-1背包问题非常相似,可以将其理解为有权重的0-1背包问题。只不过是把0-1背包问题中的1表示为具体数字大小,0依然是0,表示不在子集和中。所以这个问题的解空间也是一个子集树。回溯法:子集树的解空间。子集树的解空间框架我们已经很熟悉了:void Backtrack(int t){ if(t > n) Output(x); else{ for(在所有选择中遍历) {原创 2020-05-24 15:57:28 · 2755 阅读 · 0 评论 -
回溯法之圆排列问题
问题描述给定n个大小不等的圆c1,c2,…,cn,先要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3时,且所给的3个圆的半径分别为1、1、2时,这3个圆的最小长度的圆排列如图所示,其最小长度为2+4*√2.算法设计这个问题的解空间应该是一棵排列树。因为圆就是按照一定的顺序排在矩形框中的,这里面我们将圆的半径进行排序,从而代表圆排序。其中a=[r1,r2,…,rn]就是我们的序列。CirclePerm(n,a)返回找原创 2020-05-13 13:10:13 · 3672 阅读 · 0 评论 -
回溯法之N皇后问题
N皇后的问题大家应该都很清楚了,毕竟是一个很经典的算法,这次我们将从其本质模板和迭代递归两种方法来解决这个问题。问题描述一个nxn的棋盘格,,放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之在同一行或同一列或同一斜线上的棋子。n后问题等价于,在nxn的棋盘上放置n个皇后,任何2个皇后不放在同一行或者同一列或者同一斜线上。题目分析首先我们看一下什么样的位置满足放置条件:同行,同列,同斜线无皇后。那么我们就需要多三种方向进行检查,如果有皇后我们就要放弃当前位置,换下一位置。我们用x原创 2020-05-11 13:45:41 · 882 阅读 · 0 评论 -
回溯法之图的m着色问题
图的m着色问题也是经典的回溯问题,我们也可以使用DFS来解决。图的着色还有一个作用,那就判断二分图,将一个群体分成两拨,则这两拨应该着不同颜色。问题描述给定无向图G和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法,使G中每条边的2个顶点着有不同的颜色?这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为图的色数。求一个图的色数m的问题称为图的m可着色优化问题。如果一个图的所有顶点和边都能用某种方式画在平面上原创 2020-05-11 16:53:00 · 2534 阅读 · 0 评论 -
回溯法之符号三角形问题
问题描述题目分析对于符号三角形问题,用n元组x[1:n]表示符号三角形第一行的n个符号,由于我们只有两种符号——"+“或”-",所以取值是一个二值问题,如果取"+“我们就假设x[i]=1,如果取”-“我们就设x[i]=0。所以这显然是一个解空间为子集树的问题。我们不需要每次都遍历到树的叶节点,可以通过剪枝来节约时间。明确了解空间以后,我们要确定的就是约束函数。由于”+“和”-“数目相同,且...原创 2020-04-29 19:54:38 · 9699 阅读 · 6 评论 -
回溯法之批处理作业调度问题
问题描述题目分析这道题目也是一个比较经典的回溯法问题,但是这个问题和我们之前说的装载问题不同的是,这里面的每一种作业我们都要安排,而不是找其中的子集,而装载问题才是一个找子集的问题。所以根据回溯法框架里的内容,对于这种解空间中必须包含全部而不是找子集的情况,我们应该使用的解空间是排列树。结构如下图所示:我们可以将这些序列看成是在x=(1,2,3)的基础上经过各种不同作业的两两交换而得到的...原创 2020-04-29 18:31:40 · 1876 阅读 · 0 评论 -
C++回溯法装载问题
题目描述题目分析这个问题其实是一个NP难问题,当w1+w2+…wn=c1+c2的时候,装载问题等价于子集和问题。当c1=c2的时候,等价于划分问题.这两个问题都是NP难的问题,所以我们装载问题也是NP难的问题。关于这篇文章的先前相关知识请见回溯法框架如果一个给定的装载问题有解,则我们采用的策略应该是:先将第一艘轮船尽可能装满,然后将剩余的集装箱上第二艘轮船。将第一艘轮船尽可能装满等价于选取...原创 2020-04-27 18:58:26 · 4526 阅读 · 0 评论 -
通用的回溯法的算法框架
开篇算法部分已经更新了动态规划和贪心算法,接下来这一部分将会是又一经典算法——回溯法。仍然会有大量的习题等着我去琢磨去更新博客,想想虽然挺受折磨,但算法这东西你懂的,学会了的感觉更好。回溯法介绍1.问题的解空间用回溯法求解问题时,应明确定义问题的解空间。问题的解空间至少应包含问题的一个(最优)解。例如,对于0-1背包问题这个经典的问题,我们已经用动态规划法解释过一次,其实用回溯法也可以很...原创 2020-04-26 18:39:53 · 1458 阅读 · 0 评论