回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称
用回溯算法解决问题的一般步骤:
1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
3 、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
实例:假设有一种彩票,每注由七个0-29的数字组合,要求7个数数字不能重复,打印所有结果
package com.ds.practice;
import java.util.Arrays;
/*试探算法*/
public class Test3 {
static int []num=new int[29];
static int []meb=new int[7];
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
for(int i=0;i<29;i++){
num[i]=i;
}
for(int j=0;j<7;j++){
meb[j]=j;
}
new Test3().combine(meb.length, num.length);
}
public void combine(int m,int n) throws Exception{
int i=0;
for( i=n;i>=m;i--){
meb[m-1]=num[i-1];
if(m>1){
combine(m-1,i-1);
}else{
Thread.sleep(1000);
System.out.println(Arrays.toString(meb));
}
}
}
}