回溯算法

概念

        回溯法(back tracking)探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

 

实例一:八皇后问题

#include 
#include 
using namespace std;

int res=0;

//判断是否满足皇后规则
bool isOk(vector& queenVec, int row) {
	for (int i = 0; i < row; ++i) {  //将当前第row个皇后与前row-1个皇后的站位比较
		if (queenVec[row] == queenVec[i] || (queenVec[row] + row) == (queenVec[i] + i) || (queenVec[row] - row) == (queenVec[i] - i))
			return false;
	}
	return true;
}

void backtracking(vector& queenVec, int row, int n) {   
	if (row == n) { 
		res++;
		return;
	}

	for (int col = 0; col < n; ++col) {   //探索:遍历所有列
		queenVec[row] = col;
		if (isOk(queenVec, row))   //如果符合规则就安排下一个皇后(即第row+1个皇后)的位置
			backtracking(queenVec, row + 1, n);   //回溯: 进入backtracking函数后返回时
	}
}

//八皇后
int main() {
	vector queenVec(8);
	backtracking(queenVec, 0, 8);

	cout << res << endl;
	return 0;
}

示例二:01背包问题

void dfs(int i,int cv,int cw)
{  //cw当前包内物品重量,cv当前包内物品价值
    if(i>n)   
    {
        if(cv>bestval)             //是否超过了最大价值
        {
            bestval=cv;            //得到最大价值
            for(i=1;i<=n;i++)      
                bestx[i]=x[i];      //得到选中的物品
        }
    }
    else 
        for(int j=0;j<=1;j++)    //枚举物体i所有可能的路径,
        {
            x[i]=j;      
            if(cw+x[i]*w[i]<=TotCap)  //满足约束,继续向子节点探索
            {
                cw+=w[i]*x[i];
                cv+=val[i]*x[i];
                dfs(i+1,cv,cw);
                cw-=w[i]*x[i];    //回溯上一层物体的选择情况
                cv-=val[i]*x[i];
            }
        }
}
主函数部分
int main()
{
    int i;
    bestval=0; 
    cout<<"请输入背包最大容量:"<>TotCap;
    cout<<"请输入物品个数:"<>n;
    cout<<"请依次输入物品的重量:"<>w[i];
    cout<<"请依次输入物品的价值:"<>val[i];
    dfs(1,0,0);
    cout<<"最大价值为:"<

 

参考:小白带你学---回溯算法(Back Tracking)

你可能感兴趣的:(数据结构与算法)