1.概念:java
回溯法其实是上一个相似枚举的搜索尝试过程,主要是在搜索尝试过程当中寻找问题的解,当发现不知足要求的解条件时,就“返回”,尝试别的路径。算法
回溯法是一种优先搜索法,按照选优条件向前搜索,以达到目标。可是当搜索到某一步时,发现原先选择的并非最优的或者达不到目标,就退回一步,从新选择。框架
许多复杂的,规模较大的问题均可以使用回溯法。函数
2.基本思想code
在包含问题的全部解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树。当探索到某一节点时,要先判断该节点是否包含问题的解,若是包含,就从该节点继续出发,探索下去,若是街边不包含问题的解,则逐层回溯到祖先节点。(主要的思想是深度优先遍历)class
3.回溯法的的通常步骤:扩展
(1) 针对所给的问题,肯定问题的解空间,解空间至少包含问题的一个最优解搜索
(2)肯定节点的扩展搜索规则遍历
(3)以深度优先方式搜索解空间,利用“剪枝函数”进行吧避免无效的搜索。co
4算法框架:
int[] a =new int [n]; try(int i) { if(i>n) 输出结果; else { for(int i=0;i<=上界;j++) { if(fun(j) { a[i]=j; ... try(i+1); } ) } } }
分支限界法的搜索方式是以广度优先或者以最小耗费优先的方式进行搜索空间树。