回溯算法

【算法思想:回溯法】回溯算法入门级详解 回溯算法与深度优先遍历 以下是维基百科中「回溯算法」和「深度优先遍历」的定义。 回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况: 找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。 深度优先搜索 算法(英语:Depth-Fir 阅读详情

一,回溯算法的基本思想

回溯法从根节点出发,以深度优先搜素整个解空间。这个根节点成为活节点,成为当前的扩展节点。在当前扩展节点处,搜索向纵深方向移至一个新节点,这个新节点成为新的活节点,并成为当前扩展节点。如果在当前扩展节点处不能再向纵深方向移动,则当前扩展节点就成为死节点。此时,应往回移动至最近一个活节点处,并使这个活节点成为当前扩展节点。回溯法以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已无活节点时为止。


二,子集树与排列树

子集树与排列数是用回溯法解问题时,常遇到的两种类型的解空间树。

1,子集树算法框架

void BackTrack(int i){
    if(i >= n ){
        //代码
    }
    if(c + w[i] <= load){
        c += w[i];
        x[i] = 1;
        BackTrack(i + 1);
        c -= w[i];
    }
    x[i] = 0;
    BackTrack(i + 1);
}
 

2,排列数算法框架

void BackTrack(int i){
    if(i >= n ){
        //代码
    }
    for(int j = i; j <n; j ++){
        c += w[x[j]];
        if(c > best){
            Swap(i, j);
            BackTrack(i + 1);
            Swap(i, j);
        }
        c -= w[x[j]];
    }
}
 
三,常见的使用回溯法解决的问题

1,n后问题

class Queue{
private:
    int n;          //皇后数
    int sum;        //当前找到的可行方案数
    vector<int> x;  //存储当前解
public:
    Queue(int n):n(n){
        sum = 0;
        for(int i = 0; i <= n; i ++){
            x.push_back(0);
        }
    }
    bool isAttack(int i);
    void BackTrack(int i);
    int getSum();
};

/**
*  判断在第i层放置一个皇后之后,是否会与前面的皇后发生攻击,
*  如果会发生攻击返回true,否则返回false
*/
bool Queue::isAttack(int i){
    for(int j = 1; j < i; j ++){
        if(x[j] == x[i] || abs(j - i) == abs(x[j] - x[i])){
            return true;
        }
    }
    return false;
}

void Queue::BackTrack(int i){
    if(i > n){
        sum ++;
    } else {
        for(int j = 1; j <= n; j ++){
            //在第i行、第j列放置一个皇后
            x[i] = j;
            if(!isAttack(i)){
                BackTrack(i + 1);
            }
        }
    }
}

int Queue::getSum(){
    BackTrack(1);
    return sum;
}


2,旅行商问题(排列树)

const int INF = 10000000;
const int MaxSize = 20;
class Traveling{
private:
    int n;                       //图中的顶点数
    int c;                       //当前费用
    int bestc;                   //当前最优费用
    vector<int> x;               //当前解
    vector<int> bestx;           //当前最优解
    vector<vector<int> > e;      //图的邻接矩阵
public:
    Traveling(int a[][MaxSize], int n);
    void BackTrack(int i);
    void Swap(int i, int j);
    int getBestc();
};

Traveling::Traveling(int a[][MaxSize], int n):n(n){
    c = 0;
    bestc = INF;
    for(int i = 0; i < n; i ++){
        x.push_back(i);
        bestx.push_back(i);
        vector<int> temp(n);
        e.push_back(temp);
    }
    for(int i = 0; i < n; i ++){
        for(int j = 0; j < n; j ++){
            if(a[i][j] == -1){
                e[i][j] = INF;
            } else {
                e[i][j] = a[i][j];
            }
        }
    }
}

void Traveling::BackTrack(int i){
    if(i >= n){
        if(e[x[n -1]][x[0]] != INF && c + e[x[n -1]][x[0]] < bestc){
            for(int j = 0; j < n; j ++){
                bestx[j] = x[j];
            }
            bestc = c + e[x[n -1]][x[0]];
        }
        return;
    }
    for(int j = i; j < n; j ++){
        if(i == 0){
            Swap(i, j);
            BackTrack(i + 1);
            Swap(i, j);
        } else {
            if(e[x[i - 1]][x[j]] != INF && c + e[x[i - 1]][x[j]]< bestc){
                Swap(i, j);
                c += e[x[i - 1]][x[i]];
                BackTrack(i + 1);
                c -= e[x[i - 1]][x[i]];
                Swap(i, j);
            }
        }
    }
}

void Traveling::Swap(int i, int j){
    int temp = x[i];
    x[i] = x[j];
    x[j] = temp;
}

int Traveling::getBestc(){
    BackTrack(0);
    return bestc;
}

[leetcode·回溯算法]回溯算法解题套路框架 回溯算法本质上就是遍历一颗多叉树:1、确定递归终止条件2、执行单层操作逻辑3、确定下一层递归所需的操作列表4、注意剪枝和代码优化。 阅读详情

相关推荐

【回溯算法】总结回溯算法的写法套路

从回溯算法的经典例题【八皇后问题】和【全排列问题】,总结一般写法套路。

Selena的笔记本 1882

算法学习——回溯法

回溯法的实质 回溯法可看作穷举法的一种实现方式   计算过程 每步只构造一个部分节并立即对此部分解进行评估。若此部分解有可能拓展为“所求解”,则继续扩展;反之此部分解不可能扩展为所求解,则继续尝试其他部分解。直到穷尽一切可能。   解空间与解空间树 描述回溯法时,可有两种解空间树选择。一是子集树,一是排列树。 解空间:所有可能的解构成的集合。 解空间树:将解空间组织成树结构。 ...

lianup的博客 4882

Python 回溯算法

最近leetcode刷题遇到了许多和回溯法有关的题,然而对回溯法完全没有过系统的了解明显感觉费力了很多狠心打算一次把回溯法弄懂,开个贴记录一下学习过程 回溯法的基本模板 class solution: def solvepermutation(self,*arg,**kwg): pass #初始化输入输出内容 #定义helper函数,构建回溯主体 def h...

weixin_42484871的博客 1838

回溯法

用回溯法解题时常用到两种典型的解空间树:子集树与排列树 子集树 当问题是:从n个元素的集合S中找出满足某种性质的子集时相应的解空间树称为子集树,例如n个物品的0/1背包问题 这类子集树通常有2n个叶结点 解空间树的结点总数为2n+1-1 遍历子集树的算法需Ω(2n)计算时间 void backtrack (int t) { if(t > n){ output(x);// 输出结果 }else{ for (int i = 0; i <= 1; i

zhoubao_z的博客 413

【东华大学oj】找到最大数(一维数组->中等)

一天,老师布置了一个作业,要求对一串数字各不相同的数字串进行排序,大的在前,小的在后。接着,我从数字串中的第二个数字开始往后找,找到最大的一个,然后与第二个数字交换,这样的话我就能够确定排序后数字串中的第二个数字;明明研究发现,他的这个想法中最重要的一环就是在一串数字中找到最大的那个,然后与第一个数字交换,可是明明毕竟刚刚开始学习程序设计不久,无法写出较复杂的程序,所以明明想让你这位程序设计专家帮他的忙,帮助他把这段核心程序写出来,然后明明只需模仿着写就可以了。时间限制: 1S类别: 一维数组->中等。

的博客 525

Multisim实战:从零搭建体温检测报警电路(附完整仿真文件+调试技巧)

本文详细介绍了如何使用Multisim从零搭建体温检测报警电路,涵盖LM35温度传感器、LM358运算放大器等核心器件的选型与连接,以及信号调理、阈值比较和数码管显示等关键电路设计。附赠完整仿真文件和实用调试技巧,帮助电子工程初学者快速掌握体温温度检测系统的设计与实现。

weixin_28285943的博客 293

回溯法中常见的的两类解空间树

回溯法中常见的两类典型的解空间树是子集树和排列树。

weixin_44194749的博客 5221

SAP采购申请详述;以及采购计划协议/交货计划行

SAP采购申请详述;以及采购计划协议/交货计划行

saplakes的博客 4341

算法设计——回溯法相关概念

回溯法 适用于解一些组合数相当大的问题 策略: 深度优先策略 从根节点出发搜索解空间树 到任一点时: 1.先判断是否包含问题的解 2.如果不包含,则跳过对该结点为根的子树的搜索,逐层向 其祖先结点回溯 3.否则,进入该子树,继续按深度优先策略搜索 回溯法的算法框架 问题的解空间 其含义为:所有可能解组成的空间 问题的解向量:一个n元式(x1,x2,x3…xn)的形式 显约束:对分量xi的取值进行限...

Doro_的博客 1087

FPGA开发者必看:手把手教你用Xilinx ERNIC IP实现RoCE v2网络加速(附PG332文档解读)

本文详细解析了Xilinx ERNIC IP在FPGA平台上实现RoCE v2网络加速的全流程,包括架构设计、Vivado工程配置、驱动开发与性能调优。通过PG332技术文档的实践指导,帮助开发者快速构建低延迟、高性能的网络加速方案,适用于数据中心和边缘计算场景。

weixin_29168813的博客 670

NVIDIA 2025 Board Design Engineer 校招笔试全解析:从基础门电路到理想放大器设计

本文详细解析了NVIDIA 2025届板级设计工程师校招笔试的核心考点与解题策略。内容涵盖从基础门电路、CMOS实现NOR门,到开关电源CCM/DCM模式波形分析与效率计算,以及理想运放电路设计与稳定性优化。旨在帮助考生构建硬件知识体系,掌握工程思维,顺利通过NVIDIA Board Design Engineer校招笔试。

weixin_29172201的博客 196

回溯法-简介

回溯法本质是,走不通就退回再走的技术。 优选搜索法:按照选优条件深度优先搜索,以达到目标。 (1)解空间:所有可能解组成的空间。 解的组织形式 -&gt; n元组{x1,x2,...,xn} 3个物品的0-1背包问题 -&gt; {x1,x2,x3} 显约束:对解分量的取值范围的限定。 (2)解空间的组织结构 -&gt; 解空间树 (3)搜索解空间树 隐约束:对能否得到问题的可行解...

HeinSven的博客 1285

一文读懂Cache一致性原理

本文介绍了为什么需要维护cache一致性、一致性协议的本质和类别,以及如何设计一致性协议。

W1Z1Q的专栏 6846

回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。什么是回溯算法?一道算法题走进回溯算法回溯算法框架套路leetcode案例分析回溯算法,一种通过探索所有可能的候选解来找出所有的解的算法。它采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。找到一个可能存在的正确的答案;

Blue_Pepsi_Cola的博客 7242

数字加网(一)— —概念及分色合成

由于大多数图像复制设备是二值设备,因此在图像复制过程中,必须先把连续调的灰度图像或彩色图像处理成二值的半色调图像,用单位面积的网点覆盖率来表现图像的颜色深浅变化。这个过程被称之为加网(Screening) 数字加网就是根据人眼视觉的空间混色特性,用人眼无法分辨的细小黑白点的单位覆盖面积来模拟灰度图像或彩色图像的层次变化,使得到

Sin_Geek成长の迹 8594

使用 Simulink + Simscape Electrical 实现一个三相电压型PWM整流器的仿真模型

三相电压型PWM整流器(Voltage Source PWM Rectifier, VSR)是一种先进的电力电子装置,它不仅可以将交流电转换为直流电,还能实现单位功率因数操作,即输入电流与输入电压同相位。这不仅提高了电网质量,减少了谐波污染,而且提高了整个系统的效率。本文将详细介绍如何使用实现一个三相电压型PWM整流器的仿真模型,并探讨其在单位功率因数下的控制策略和仿真结果。本文详细介绍了如何使用搭建一个三相电压型PWM整流器的仿真模型,并对其在单位功率因数下的控制策略进行了探讨。

amy_mhd的博客 128

【算法专题】回溯算法

介绍回溯算法以及如何使用回溯算法解题!

YoungMLet的博客 3307

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【算法】回溯算法

回溯算法

Code 小白的博客 6164

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

图解回溯算法

回溯算法 是什么? 回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 可以解决什么问题? 排列、组合(子集、幂集、字符全排列)。 在传值时,对于排列问题,是要删掉单个用过的元素;组合问题,是删掉前面所有的元素。 数组、字符串,给定一个特定的规则,尝试搜索迭代找到某个解。 二维数组下的DFS搜索(八皇后、黄金矿工、数独)

粥同学的学习笔记 7380

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

搜索与回溯算法

为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。 一、前言 搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发...

程序员世杰 9386

【回溯算法】- 带你深入了解回溯

回溯到第三层,尝试其他列放置皇后: - 尝试在 (2, 2),发现冲突,回溯到第二层。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ]输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]- 选择在 (1, 2) 放置 Q。

2301_81253185的博客 2236

【算法】回溯算法专题③ ——排列型回溯 python

回溯法是一种通过尝试每一种可能性来找到所有解的算法。对于N皇后问题,特别是带有额外约束条件的问题(如本题中的皇后之间在同一条45度角斜线上至少相隔3行),回溯法是一个非常合适的选择。

查理零世的博客 1654
上一篇: STL 二级配置器
下一篇: Segment default
一个不务正业的程序猿
博客等级 码龄11年 1879粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值