回溯法(backtracking)

文章目录

参考资料:
代码随想录,回溯
递归,dfs,bfs,回溯的联系与区别

概念

  • 概念:枚举问题的每一种解,过程通常为 选择->递归->回溯,回溯也就是撤销前一步的选择
  • 条件:
  • 时间复杂度:暴力搜索法的一种
  • 其他:
    • 可形成树形结构
    • 可通过剪枝优化
    • 回溯主要体现的是不断试错及回退的算法思想,而递归主要的是指函数调用自身的算法操作,通常使用递归来实现回溯
    • BFS是用于遍历多维数据结构的算法,而其搜索过程很符合回溯的思想

代码

以组合问题为例,给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合
其中,可以设计传入参数为temp_result,每次递归传入temp_result+i,可以省略回溯的步骤

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int> result;
vector<int> temp_result;

void recursion(int n, int k, int begin_index)
{

    // 递归终止条件
    if (temp_result.size() == k)
    {
        result.push_back(temp_result);

        return;
    }

    for (int i = begin_index; i <= n; ++i)
    {
        temp_result.push_back(i);
        //  可以设计传入参数为temp_result,每次递归传入temp_result+i,可以省略回溯的步骤
        recursion(n, k, i + 1); 
        temp_result.pop_back();
    }
}

vector<vector<int>> combine(int n, int k)
{
    recursion(n, k, 1);
    return result;
}

图解

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用回溯解决货郎问题的Python示例代码: ```python import sys # 计算两个城市之间的距离 def distance(city1, city2): # 这里假设city1和city2是城市的坐标,可以根据实际情况进行修改 return abs(city1[0] - city2[0]) + abs(city1[1] - city2[1]) # 回溯函数 def tsp_backtracking(cities, current_path, current_cost, best_path, best_cost, visited): # 如果已经访问了所有城市,且当前路径的总距离更小,则更新最优路径和最优距离 if len(current_path) == len(cities): if current_cost < best_cost: best_path[:] = current_path[:] best_cost[0] = current_cost return # 遍历所有未访问的城市 for i in range(len(cities)): if not visited[i]: # 更新当前路径和总距离 current_path.append(cities[i]) current_cost += distance(current_path[-2], current_path[-1]) if len(current_path) > 1 else 0 visited[i] = True # 递归调用回溯函数 tsp_backtracking(cities, current_path, current_cost, best_path, best_cost, visited) # 回溯,恢复状态 visited[i] = False current_cost -= distance(current_path[-2], current_path[-1]) if len(current_path) > 1 else 0 current_path.pop() # 主函数 def tsp(cities): # 初始化最优路径和最优距离 best_path = [] best_cost = [sys.maxsize] # 初始化当前路径、当前距离和访问状态 current_path = [] current_cost = 0 visited = [False] * len(cities) # 从第一个城市开始回溯 current_path.append(cities[0]) visited[0] = True # 调用回溯函数 tsp_backtracking(cities, current_path, current_cost, best_path, best_cost, visited) return best_path, best_cost[0] # 示例用 cities = [(0, 0), (1, 2), (3, 1), (2, 3), (4, 4)] best_path, best_cost = tsp(cities) print("Best path:", best_path) print("Best cost:", best_cost) ``` 这段代码使用回溯来解决货郎问题。它通过枚举所有可能的路径,并使用剪枝策略来减少不必要的计算。最终找到最短路径和最短距离。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值