回溯法总结

回溯法

主要思想:

利用深度优先搜索(DFS)作为算法实现的主要思想,配合限界条件进行剪枝,来减小空间的占有量。限界条件分为显式限界与隐式限界两种(后面会说)。

运用步骤:

伪代码范式:

backtrack ( int i )//i为当前递归的深度
{
	if( i > n ) {
		output/record;
		return;
	}//到达叶子节点,判断是否输出或者记录
	else{
		if( x[i]不满足显式限界条件 ){
			记录x[i];
			backtrack( i+1);
			清除记录x[i];
		}//左孩子
		else if ( x[i] 不满足隐式限界条件 ){
			backtrap ( i + 1 );
		}//右孩子
	}		
}

限界条件:

限界条件分为两种:

1. 显式限界条件

显示限界条件为题目中已经给出的,具有明显说明的条件,或者是常识:
例如

  1. 0/1背包中,显式限界条件为:
    cur_weight + w[i] > weight
    意味当前质量加上当前物品质量大于背包总重量,即无法放入当前物品,就剪枝,不展开当前子树。
  2. 8-皇后问题中,显式限界条件为:
    x[i] = { 0 , 1 ,2 ,…};
    意味着最后输出的矩阵中,只能是整数。
2. 隐式限界条件

隐式限界条件,是为了剪枝,缩小储存空间与运行时间,自己定义的启发式的限界条件:
例如:

  1. 0/1背包:
    cur_value + bound <= bestv
    意味着子树能达到的价值上限比当前的最优价值小,因此剪枝,不继续展开。
  2. 8-皇后问题:
    棋子不在同一对角线,也不在同一行,同一列
    题目中给出。

具体实例:

8-皇后问题:

链接: link.

货箱装载问题

链接: link

图的m着色问题

链接:link

最大团问题

在这里插入图片描述

子集合数问题

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值