算法设计与分析复习--回溯(一)

文章目录

  • 上一篇
  • 回溯法性质
  • 子集和问题
  • 装载问题
  • 下一篇

上一篇

算法设计与分析复习–贪心(二)

回溯法性质

类似穷举的搜索尝试过程,在搜索尝试过程中寻找问题的解,组织得井井有条(避免遗漏), 高效(剪裁避免不必要搜索)

使用深度优先的搜索策略(DFS + 剪枝)

回溯法的阶梯框架:

  1. 子集树算法框架
  2. 排序树算法框架

在这里插入图片描述
在这里插入图片描述
结点类型:

  1. 活结点:自身已生成但是其儿子还没有全部生成
  2. 拓展结点:正在产生儿子的结点
  3. 死结点:不满足约束或所有儿子已经产生,不能向纵深方向移动

为了避免生成那些不可能产生最优解的问题状态,要不断利用限界函数,处死结点=>剪枝

剪枝策略:

  1. 可行性剪枝,左剪枝
  2. 最优性剪枝,右剪枝
  3. 交换搜索顺序,排序方式变化

解空间类型:

  1. 子集树:所给的问题是从n个元素集合S中找出满足某种性质的子集。
    在这里插入图片描述

  2. 排列数:所给问题是确定n个元素满足某种性质的排列。
    在这里插入图片描述
    采用交换方式实现的全排列(顺序有点问题)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10;

int a[N], n;
int path[N];

void dfs(int* ans, int k)
{
    if (k == n - 1){
        for (int i = 0; i < n; i ++)
            printf("%d ", ans[i]);
        puts("");
    }
    
    for (int i = k; i < n; i ++){
        swap(ans[k], ans[i]);
        dfs(ans, k + 1);
        swap(ans[k], ans[i]);
    }
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++) path[i] = i + 1;
    
    dfs(path, 0);
    return 0;
}

在这里插入图片描述
在这里插入图片描述

基于子集树框架的问题求解:

  1. 子集和问题
  2. 装载问题
  3. 0-1背包问题
  4. 图的m着色问题

基于排列树框架的问题求解:

  1. 旅行商问题(TSP)
  2. N皇后问题

子集和问题

问题描述:给定n个不同正实数的集合W = {w(i) | 1 <= i <= n}和一个正整数M, 要求找到子集S使得求和为M。

子集和问题要求出所有可行解

左剪枝:求和不超过M => cw + a[i] <= M
右剪枝:当前已选的价值与剩余的数的价值的和要大于M否则不可能找到 => cw + rw >= M

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 110;

int a[N], n, M, cw, rw;
vector<int> ans;

void dfs(int k)
{
    if (k == n)//根节点是0叶结点就是n
    {
        if (cw == M){
            for(auto i : ans)
                printf("%d ", i);
            puts("");
        }
        return;
    }
    rw -= a[k];
    if (cw + a[k] <= M){//左剪枝条件
        cw += a[k];
        ans.push_back(a[k]);
        dfs(k + 1);//向左走
        ans.pop_back();
        cw -= a[k];
    }
    if(rw + cw >= M)//右剪枝条件
        dfs(k + 1);//向右走
        
    rw += a[k];
}

int main()
{
    scanf("%d%d", &n, &M);
    
    for (int i = 0; i < n; i ++) scanf("%d", &a[i]), rw += a[i];
    
    dfs(0);
    return 0;
}

在这里插入图片描述

装载问题

和贪心中的装载问题不同
问题描述:n个集装箱要装到2艘载重量分别c1,c2的货轮,其中集装箱 i i i 的重量 为 w i w_i wi。要求找到合理的装载方案将这n个货箱装上这2艘轮船。

要使两个船都装上,可以考虑将第一个船尽可能装满,然后将剩下的货物装在第二艘船上,如果没超重就是可行的,将考虑两个船的问题转换成考虑一个。

为找到将左边轮船撞得最满的方案,用bestw进行限界

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 110;

int a[N], n, c1, c2;
int cw, bw, rw, other;
vector<int> ans;

void dfs(int k)
{
    if (k == n){
        bw = cw;
        if(other > c2) return;//other是另一艘船货物重量
        for (auto i : ans)
            printf("%d ", i);
        puts("");
        return;
    }
    
    rw -= a[k];
    if (cw + a[k] <= c1)
    {
        cw += a[k];
        ans.push_back(a[k]);
        dfs(k + 1);
        ans.pop_back();
        cw -= a[k];
    }
    if (cw + rw >= bw){
        other += a[k];
        dfs(k + 1);
        other -= a[k];
    }
    rw += a[k];
    
}

int main()
{
    scanf("%d%d%d", &n, &c1, &c2);
    
    for (int i = 0; i < n; i ++) scanf("%d", &a[i]), rw += a[i];
    
    dfs(0);
    return 0;
}

在这里插入图片描述

下一篇

算法设计与分析复习–回溯法(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/172839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KNN(k近邻法)算法理论和实战

KNN概念 k近邻法&#xff08;k-nearest neighbor&#xff0c;k-NN&#xff09;是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点&#xff1b;输出为实例的类别&#xff0c;可以取多类。 k近邻法假设给定一个训练数据集&#xff0c;其中的实例类…

【机器学习】039_合理初始化

一、稳定训练 目标&#xff1a;使梯度值在更合理的范围内 常见方法如下&#xff1a; 将乘法变为加法 ResNet&#xff1a;当层数较多时&#xff0c;会加入一些加法进去 LSTM&#xff1a;如果时序序列较长时&#xff0c;把一些对时序的乘法做加法 归一化 梯度归一化&…

全链路压测的步骤及重要性

全链路压测是一种系统性的性能测试方法&#xff0c;旨在模拟真实用户场景下的完整操作流程&#xff0c;全面评估软件系统在不同压力下的性能表现。这种测试方法对于保证应用程序的高可用性、稳定性和可扩展性至关重要。 1. 全链路压测概述 全链路压测是在模拟实际用户使用场景的…

SMU可以供电的同时测量电流和电压

SMU可以供电的同时测量电流和电压 SMU本身能够提供电流或电压&#xff0c;同时测量负载或被测设备&#xff08;DUT&#xff1a;Device Under Test&#xff09;上的电流和电压。这是与传统电源相比使用SMU的优势之一。 SMU测量的电流和电压值将反映在NI-DCPower软面板中&#…

(swjtu西南交大)数据库实验(数据库需求分析):音乐软件数据管理系统

实验内容&#xff1a; 数据库需求分析&#xff1a;各用户组需求描述&#xff0c;绘出数据流图&#xff08;详细案例参见教材p333~p337&#xff0c;陶宏才&#xff0c;数据库原理及设计&#xff0c;第三版&#xff09;&#xff1b; 一、选题背景 近年来&#xff0c;“听歌”逐…

【docker】虚拟化和docker容器概念

基础了解 IAAS&#xff1a; 基础设施服务&#xff0c;&#xff08;只提供基础设施&#xff0c;没有系统&#xff09; **SAAS&#xff1a; ** 软件即服务&#xff0c;&#xff08;提供基础设施和系统&#xff09; PAAS&#xff1a; 平台即服务&#xff0c;&#xff08;提供基…

【Docker】从零开始:1.Docker概述

【Docker】从零开始&#xff1a;1.Docker概述 1.什么是Docker2.为什么要使用Docker3.传统虚拟机技术与Linux容器技术的区别(1).传统虚拟机技术(2).Linux容器 4.Docker的特点一次构建、随处运行a.更快速的应用交付和部署b.更便捷的升级和扩缩容&#xff1a;c.更简单的系统运维d.…

三字经||无聊数了下三字经的字数

三字经总字数去除标点后1416个 该文章无技术含量&#xff0c;仅三字经原文&#xff0c;学技术的同学可以止步了 三字经&#xff08;原文&#xff09; 【作者】王应麟 【朝代】南宋 人之初&#xff0c;性本善。性相近&#xff0c;习相远。 苟不教&#xff0c;性乃迁。教之道&a…

视频接入网关的用法

视频接入网关是一种多功能的视频网关设备&#xff0c;可以解决各种视频接入&#xff0c;视频输出&#xff0c;视频转码&#xff0c;视频融合的问题。可以应用在应急指挥&#xff0c;智慧融合等项目中&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。…

matlab-BP神经网络的训练参数大全

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 本文列兴趣MATLAB神经网络工具箱中&#xff0c;训练参数trainParam的各个参数与意义 以方便在使用matlab工具箱时&#xff0c;用于查阅 一、matlab神经网络工具箱trainParam的参数列表 trainParam中的各个具体参数如下…

【数据结构(三)】单链表(1)

文章目录 1. 链表介绍2. 单链表应用实例2.1. 顺序添加方式2.1.1. 思路分析2.1.2. 代码实现 2.2. 按照编号顺序添加方式2.2.1. 思路分析2.2.2. 代码实现 3. 单链表节点的修改3.1. 思路分析3.2. 代码实现 4. 单链表节点的删除4.1. 思路分析4.2. 代码实现 5. 单链表常见面试题5.1.…

代码随想录算法训练营|五十九~六十天

下一个更大元素|| 503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 和每日温度一样的套路&#xff0c;就是这里可以循环数组&#xff0c;两个数组拼接&#xff0c;然后循环两遍就行。 public class Solution {public int[] NextGreaterElements(int[] nums)…

Python如何实现模板方法设计模式?什么是模板方法设计模式?Python 模板方法设计模式示例代码

什么是模板方法&#xff08;Template Method&#xff09;设计模式&#xff1f; 模板方法&#xff08;Template Method&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤延迟到子类中实现。这种模式允许子类为一个算法的特定步骤提供…

DeepStream--测试lpdnet车牌检测模型

模型地址&#xff1a;https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/lpdnet/version 模型格式已经从加密的etlt格式变为onnx格式。这个模型用于从汽车图片上检测出车牌位置&#xff0c;模型有两个&#xff0c;一个用于美国车&#xff0c;一个用于中国车。 Nv…

Mysql之聚合函数

Mysql之聚合函数 什么是聚合函数常见的聚合函数GROUP BYWITH ROLLUPHAVINGHAVING与WHERE的对比 总结SQL底层原理 什么是聚合函数 对一组数据进行汇总的函数&#xff0c;但是还是返回一个结果 聚合函数也叫聚集&#xff0c;分组函数 常见的聚合函数 1.AVG(): 求平均值 2.SUM() :…

HarmonyOS基础组件之Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能&#xff0c;这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说&#xff0c;功能比较丰富&#xff0c;扩展性高&#xff0c;减…

OpenShift 4 - 部署 RHODS 环境,运行 AI/ML 应用(视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 1.33 的环境中验证 文章目录 RHODS 简介安装 RHODS 环境运行环境说明用 RHODS Operator 安装环境创建 Jupyter Notebook 运行环境 开发调式 AI/ML 应用部署运行 AI/ML 应用视频参…

国产压力测试工具的主要作用

国产压力测试工具可以帮助软件开发和维护团队对系统进行全面的性能测试&#xff0c;以评估系统在高负载下的性能表现。以下是国产压力测试工具的主要作用&#xff1a; 性能评估&#xff1a;国产压力测试工具可以模拟多用户同时对系统进行访问和操作&#xff0c;通过对系统的响应…

SpringBoot 自动装配原理 - 支付宝支付封装starter

SpringBoot 自动装配 SpringBoot 自动装配原理详细介绍自定义 Spring Boot Starter1.读取配置文件2.注册 AlipayClient bean3.核心代码编写4.注册 AlipayAPI bean5.编写 META-INF/spring.factories 文件6.项目结构测试1.创建一个测试项目&#xff0c;引入自定义 starter 依赖2.…

golang学习笔记——接口和继承比较1

继承 Go 语言的设计之初&#xff0c;就不打算支持面向对象的编程特性&#xff0c;因此 Go 不支持面向对象的三大特性之一——继承。但是 Go 可以通过组合的思想去实现 “继承”。继承是面向对象的三大特性之一&#xff0c;继承是从已有的类中派生出新的类&#xff0c;新的类能…