一、什么是回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。

二、回溯算法思想

回溯法一般都用在要给出多个可以实现最终条件的解的最终形式。回溯法要求对解要添加一些约束条件。总的来说,如果要解决一个回溯法的问题,通常要确定三个元素:

1、选择。对于每个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择,要怎么选择,这个要知道;同时,在编程时候要定下,优先或合法的每一步选择的顺序,一般是通过多个if或者for循环来排列。

2、条件。对于每个特定的解的某一步,他必然要符合某个解要求符合的条件,如果不符合条件,就要回溯,其实回溯也就是递归调用的返回。

3、结束。当到达一个特定结束条件时候,就认为这个一步步构建的解是符合要求的解了。把解存下来或者打印出来。对于这一步来说,有时候也可以另外写一个issolution函数来进行判断。注意,当到达第三步后,有时候还需要构建一个数据结构,把符合要求的解存起来,便于当得到所有解后,把解空间输出来。这个数据结构必须是全局的,作为参数之一传递给递归函数。

三、递归函数的参数的选择,要遵循四个原则

1、必须要有一个临时变量(可以就直接传递一个字面量或者常量进去)传递不完整的解,因为每一步选择后,暂时还没构成完整的解,这个时候这个选择的不完整解,也要想办法传递给递归函数。也就是,把每次递归的不同情况传递给递归调用的函数。

2、可以有一个全局变量,用来存储完整的每个解,一般是个集合容器(也不一定要有这样一个变量,因为每次符合结束条件,不完整解就是完整解了,直接打印即可)。

3、最重要的一点,一定要在参数设计中,可以得到结束条件。一个选择是可以传递一个量n,也许是数组的长度,也许是数量,等等。

4、要保证递归函数返回后,状态可以恢复到递归前,以此达到真正回溯。

四、学习例题

1.给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

2.思路

首先利用回溯枚举出所有括号的可能性,然后进行判断是否符合要求(n对并且是有效的括号组合),就添加到list表格中。

对于递归函数变量需要全局变量列表list:用来存储符合要求的括号组合。

局部变量temp:表示当前函数的括号组成样式。

计数器x:判断递归次数,限制其底界。

总的形成括号对数n。

3.代码(力扣中国第22题)

public List generateParenthesis(int n) {        List list=new ArrayList();        add_list(list,"(", 1, n*2);               return list;    }        //书写递归函数        public void add_list(List list,String temp,int x,int n)        {        x++;        if(x<=n)        {          add_list(list,temp+"(",x,n);          add_list(list,temp+")",x,n);                    }        if(x>n)        {            //在这里写判断条件是否符合有效的括号组合            char[] k=temp.toCharArray();            //计数器            int timer=0;            for(int i=0;in/2)                {                    return;                }                else                {                    if(k[i]=='(')                      {                          timer++;                      }else                      {                          timer--;                                                }                }                         }            if(timer==0)            list.add(temp);        }            }

回溯法基本思想_回溯算法(一)相关推荐

  1. python 回溯法 01背包问题_回溯法解决01背包问题

    回溯法是一个既带有系统性又带有跳跃性的搜索算法. 它在包含问题的所有解的解空间树中按照 深度优先的策略, 从根节点出发搜索解空间树. 算法搜索至解空间树的任一节点时, 总是先判断 该节点是否肯定不包含 ...

  2. python 回溯法 01背包问题_回溯法-01背包问题

    一.问题描述 给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i].现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大 二 ...

  3. 回溯法基本思想_数据结构之简单的回溯算法

    回溯算法在数据结构中是一种常用的算法,也是一种暴力求解法,基本思想是深度遍历,选择一条路一步一步走,当走不通的时候或者已经求得正确的结果,返回上一步,接着选择另一条路走,直到遍历完所有节点. 回溯算法 ...

  4. 回溯法基本思想_LeetCode--回溯法心得

    这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能解决这类回溯法的套路出来,方便以后快速解决此类题目.于是我在网上找了两个很经典的回溯法题目--八皇 ...

  5. 回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园

    第一次编写,格式写的比较混乱.先把源码上来吧.这个源码是模仿教材上的(本人学生一枚 ).分析过程在下面. #include using namespace std; class Traveling{ ...

  6. 回溯法 批处理作业调度_不懂调度系统架构,就不要谈银行数据仓库

    调度系统是数据仓库的重要组成部分,也是每个银行或公司一个基础软件或服务,需要在全行或全公司层面进行规划,在全行层面统一调度工具和规范,由于数据类系统调度作业较多,交易类系统批量优先级高,为不互相影响可 ...

  7. 回溯法解旅行商问题java,回溯法-旅行商问题

    一.问题描述 旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路 ...

  8. 如何利用扩展欧几里得算法求解不定方程_欧几里德算法、拓展欧几里德、中国剩余定理...

    01.欧几里德算法(Euclidean algorithm)(辗转相除法) 欧几里德算法又称辗转相除法,主要是用于计算两个整数a,b的最大公约数. 简单点说一下算法原理:两个整数的最大公约数等于其中小 ...

  9. python 回溯法 01背包问题_Python回溯法解决01背包问题

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. vc c语言 颜色输出字符,关于printf如何输出颜色
  2. 关于宽字符(C++将中文文本文件的内容输出到控制台
  3. php存密码,php 登录验证的代码(基于文件保存的密码)
  4. RPM方式安装MySQL5.6
  5. 大四课程设计之基于RFID技术的考勤管理系统(三)数据库设计
  6. python 排列组合_Python计算生态jieba库和random库的综合运用之爬山篇
  7. pandas 股票分析图
  8. 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
  9. 美国经济数据向淡带来重压 美元指数受阻于7月高点?
  10. word批量设置图片大小和对齐,使用宏定义
  11. vue 浏览器页面刷新
  12. 任正非文章:一江春水向东流
  13. Sketch中的快捷键总结
  14. [翻译]Reactor Netty参考指南 - 8.UDP客户端
  15. 为什么Word文档无响应,Word文档无响应的解决方法
  16. 超详细 LaTex数学公式
  17. 【web全景】web全景实现方案(转载)
  18. 手机游戏无障碍设计——猜地鼠之Android篇
  19. android 局域网 发现,局域网内android设备发现及通讯
  20. 【ZZULIOJ】1070: 小汽车的位置

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的航班预订系统
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院HR人事管理系统
  3. error C2039: “type”: 不是“cv::DataTypeT”的成员 解决办法
  4. 千人千面之3D立体个人数据营销
  5. [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
  6. shell 除法 小数点
  7. [csu/coj 1632]LCP
  8. BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理
  9. 经典中的品味:第二章 C++基本的对象,类型和值(上)
  10. [文摘20071015]图书目录: 哈佛精粹30条-浓缩哈佛大学领袖培养方案之精华