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

文章目录

  • 上一篇
  • 0-1背包问题
  • 图着色问题
  • n皇后问题
  • 下一篇

上一篇

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

0-1背包问题

问题描述:给定n中物品和一个背包。物品 i i i 的重量是 w i w_i wi ,其价格为 v i v_i vi , 背包容量为 c c c 。 问如何选择装入背包中的物品,使得装入背包物品的总价值最大?

左剪枝:满足背包容量即可

右剪枝:右剪枝就是求剩余背包重量rw = c - cw中贪心背包的最优价值,由于允许部分装入,所以一定比0-1背包装的满价值更大,结果是剩余价值的一个上界,允许右剪枝的条件更加宽松。
r v = ∑ v j ( 不超过背包剩余重量的物品价值 ) + ( 背包剩余重量 ) ∗ (不被放入的物品的单位价值)【部分装入的结果】 rv = \sum{v_j}(不超过背包剩余重量的物品价值) + (背包剩余重量) * (不被放入的物品的单位价值)【部分装入的结果】 rv=vj(不超过背包剩余重量的物品价值)+(背包剩余重量)(不被放入的物品的单位价值)【部分装入的结果】
限界函数:
c v + r v > = b v cv + rv >= bv cv+rv>=bv

交换搜索顺序:由于用到了贪心背包,所以按照物品单价从大到小的方式进行搜索。

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

using namespace std;
typedef pair<double, double> PII;

const int N = 110;

double w[N], v[N];
int n, c;
double cw, cv, bv;
vector<PII> ob, x;//x用来记录当前的搜索顺序
vector<PII> ans;//最优解,解只有一个,将这个迭代的解记录

bool cmp(PII x, PII y)
{
    return (x.second / x.first) > (y.second / y.first);
}

bool bound(int rw, int k)
{
    int i = k + 1;
    double rv = cv;
    //printf("cv: %.2lf rw: %d\n", cv, rw);
    while(i <= n && ob[i].first <= rw)
    {
        rw -= ob[i].first;
        rv += ob[i].second;
        i ++;
    }
    //printf("比值:%.2lf rw:%d\n", ob[i].second / ob[i].first, rw);
    if (i <= n) rv += (ob[i].second / ob[i].first) * rw;
    //printf("%d = %.2lf\n", k, rv);
    return rv >= bv;
}

void dfs(int k)
{
    if (k == n){
        if (cv > bv){
            bv = cv;//更新最优结果
            ans = x;
        }
        return;
    }
    
    if (cw + ob[k].first <= c)
    {
        cw += ob[k].first;
        x.push_back(ob[k]);
        cv += ob[k].second;
        dfs(k + 1);
        cv -= ob[k].second;
        x.pop_back();
        cw -= ob[k].first;
    }
    if(bound(c - cw, k))
    {
        dfs(k + 1);
    }
}

int main()
{
    scanf("%d%d", &n, &c);
    
    for (int i = 0; i < n; i ++) scanf("%lf", &w[i]);
    for (int i = 0; i < n; i ++) scanf("%lf", &v[i]);
    for (int i = 0; i < n; i ++) ob.push_back({w[i], v[i]});
    
    sort(ob.begin(), ob.end(), cmp);
    
    dfs(0);
    
    puts("对应物品的重量和价值:");
    for (auto i : ans)
        printf("{%d, %d} ", (int)i.first, (int)i.second);
    puts("\n最优价值:");
    printf("%d", (int)bv);
    return 0;
}

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

图着色问题

洛谷P2819 图的 m 着色问题

在这里插入图片描述
在这里插入图片描述
左剪枝:一条边两个节点的颜色不能相同。

#include <iostream>

using namespace std;

const int N = 110;

int color[N], g[N][N];
int n, m, ans = 0;

bool constrain(int k) {
    for (int i = 1; i <= n; i++) {
        if (g[k][i] == 1 && color[k] == color[i]) {
            return false;
        }
    }
    return true;
}

void dfs(int k) {
    if (k == n + 1) {
        ans++;
        return;
    }

    for (int i = 1; i <= m; i++) {
        int prevColor = color[k]; // Backup current color需要先将之前的颜色备份起来否则无法恢复, 后面用的时候需要判断所以不能只覆盖掉
        color[k] = i;
        if (constrain(k)) {
            dfs(k + 1);
        }
        color[k] = prevColor; // Restore the color after backtracking
    }
}

int main() {
    int k;
    cin >> n >> k >> m;

    for (int i = 0; i < k; i++) {
        int u, v;
        cin >> u >> v;
        g[u][v] = g[v][u] =1;
    }

    dfs(1); // Start from vertex 1

    cout << ans << endl;

    return 0;
}

在这里插入图片描述
只需找一个,我都找了(怒)

n皇后问题

AcWing 843. n-皇后问题

问题描述:皇后问题要求在一个nxn的棋盘上放置n个皇后,使得他们彼此不受攻击。n皇后问题要求寻找在棋盘上放置这n个皇后的方案,使得她们中任意两个都不在同一行、同一列或同一斜线。

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

using namespace std;

const int N = 10;

char g[N][N];
int x[N];//x[i] 表示第i行第j列放皇后
int n;

bool constrain(int k, int j)
{
    for (int i = 0; i < k; i ++)
        if (x[i] == j || abs(k - i) == abs(j - x[i]))
            return false;
    return true;
}

void dfs(int k)
{
    if (k == n)
    {
        for (int i = 0; i < n; i ++)
            puts(g[i]);
        puts("");
        return;
    }
    
    for (int i = 0; i < n; i ++)
    {
        if (constrain(k, i))
        {
            x[k] = i;
            g[k][x[k]] = 'Q';
            dfs(k + 1);
            g[k][x[k]] = '.';
        }
    }
}

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

在这里插入图片描述
利用st数组实现排列树

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

using namespace std;

const int N = 10;

char g[N][N];
int x[N], n;
bool st[N];

bool constrain(int k, int j)
{
    for (int i = 0; i < k; i ++)
        if (abs(k - i) == abs(j - x[i]))
            return false;
    return true;
}

void dfs(int k)
{
    if (k == n)
    {
        for (int i = 0; i < n; i ++)
            puts(g[i]);
        puts("");
        return;
    }
    
    for (int i = 0; i < n; i ++)
    {
        if (!st[i] && constrain(k, i))
        {
            st[i] = true;
            x[k] = i;
            g[k][x[k]] = 'Q';
            dfs(k + 1);
            g[k][x[k]] = '.';
            st[i] = false;
        }
    }
}

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

下一篇

未完待续

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

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

相关文章

speech studio-神经网络定制自己的声音

Speech Studio - 神经网络定制声音 - 概述 (microsoft.com)

Java,数据结构与集合源码,数据结构概述

目录 数据结构概念&#xff1a; 数据结构的研究对象&#xff1a; 研究对象一&#xff0c;数据间逻辑关系&#xff1a; 研究对象二&#xff0c;数据的存储结构&#xff08;或物理结构&#xff09;&#xff1a; 研究对象三&#xff1a;运算结构 数据结构的相关介绍&#xff…

C++初阶--类型模板

文章目录 泛型编程函数模板使用通用加法函数多模板参数必须用实例化 函数模板的原理类模板使用 注意事项 泛型编程 先看一个例子&#xff1a; 这是一些对于Swap重载的函数&#xff0c;区别是类型不同&#xff1b; 虽然能够重载使用&#xff0c;但代码复用率比较低&#xff0c…

C++11新特性 变参模板、完美转发和emplace

#include <iostream> #include <vector> #include <deque> #include <list> #include <algorithm> using namespace std;class student { public:student() {cout << "无参构造函数被调用!" << endl;}student(int age, st…

C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库四.其他 一.前言 这篇文章简单讨论一下VS如何生成和使用C静态链接库&#xff0c;示例使用VS2022环境。 二.生成静态链接库 先创建C项目-静态库 然后将默认生成的.h和.cpp文件清理干净&#xff0c;当然你也可以选择保留。 然…

Spring:IoC,AOP的简单理解与使用

IoC容器 IoC &#xff0c;Spring全家桶各个功能模块的基础&#xff0c;是创建对象的容器。 IoC概念 控制反转&#xff0c;将对象的创建进行反转&#xff0c;常规情况下对象由开发者手动创建&#xff0c;而使用IoC不再需要创建对象&#xff0c;由IoC容器根据需求自动创建项目…

2023年【上海市安全员C3证】考试内容及上海市安全员C3证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员C3证考试内容是安全生产模拟考试一点通总题库中生成的一套上海市安全员C3证复审考试&#xff0c;安全生产模拟考试一点通上上海市安全员C3证作业手机同步练习。2023年【上海市安全员C3证】考试内容及上海…

MyCAT2的主从配置

http://t.csdnimg.cn/KzwDy&#xff08;mysql主从搭建&#xff09; 前提&#xff0c;先搭建好MySQL的主从配置&#xff0c;登录MyCAT 2在MyCAT2里面操作&#xff0c;也就是连接8066这个端口。 一、创建数据源 ​​​​​​​1.创建数据源 添加读写的数据源 /* mycat:createD…

U4_1:图论之DFS/BFS/TS/Scc

文章目录 一、图的基本概念二、广度优先搜索&#xff08;BFS&#xff09;记录伪代码时间复杂度流程应用 三、深度优先搜索&#xff08;DFS&#xff09;记录伪代码时间复杂度流程时间戳结构BFS和DFS比较 四、拓扑排序一些概念有向图作用拓扑排序 分析伪代码时间复杂度彩蛋 五、强…

阿里云oss存储文件上传功能实现(保姆级教程)

先登录&#xff1a; 点击进入控制台 点击左上角导航栏按钮 搜索oss&#xff0c;点击进入 进入之后点击立即开通oss按钮&#xff0c;开通之后点击下图立即创建&#xff0c;弹出创建Bucket 填上Bucket名称&#xff0c;读写权限改为公共读。其他不变点击确定创建&#xff0c;完成…

uniapp、微信小程序返回上页面刷新数据

目录 前言&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3&#xff1a; 前言&#xff1a; 返回上页面刷新数据这个功能主要用于在当前页面点击跳转到另一个页面之后&#xff0c;在另一个页面对数据进行了操作&#xff0c;比如&#xff1a;阅读量&#xff0c;然后返…

计算机组成原理-主存储器与CPU的连接

文章目录 知识总览单块存储芯片与CPU的连接位扩展&#xff08;存储字的位数&#xff09;字扩展&#xff08;存储字数&#xff09;关于线选法和片选法字位同时扩展总结补充&#xff1a;译码器 知识总览 单块存储芯片与CPU的连接 数据总线&#xff0c;地址总线&#xff0c;片选线…

Web 自动化神器 TestCafe—页面基本操作篇

前 言 Testcafe是基于node.js的框架&#xff0c;以操作简洁著称&#xff0c;是web自动化的神器 今天主要给大家介绍一下testcafe这个框架和页面元素交互的方法。 一、互动要求 使用 TestCafe 与元素进行交互操作&#xff0c;元素需满足以下条件&#xff1a;☟ 元素在 body 页…

迅为RK3568开发板学习之Linux驱动篇第十三期输入子系统

驱动视频全新升级&#xff0c;并持续更新~更全&#xff0c;思路更科学&#xff0c;入门更简单。 迅为基于iTOP-RK3568开发板进行讲解&#xff0c;本次更新内容为第十三期&#xff0c;主要讲解输入子系统&#xff0c;共计24 讲。 关注B站&#xff1a;北京迅为电子&#xff0c;在…

Parallel Diffusion Models of Operator and Image for Blind Inverse Problems

盲逆问题算子和图像的并行扩散模型 论文链接&#xff1a;https://arxiv.org/abs/2211.10656 项目链接&#xff1a;https://github.com/BlindDPS/blind-dps Abstract 在正向算子已知的情况下(即非盲)&#xff0c;基于扩散模型的逆问题求解器已经展示了最先进的性能。然而&…

OSG文字-各种文字效果(边框、阴影及颜色倾斜)示例(2)

各种文字效果(边框、阴影及颜色倾斜)示例 各种文字效果(边框、阴影及颜色倾斜)示例的代码如程序清单9-2所示&#xff1a; 1. /* 各种文字效果(边框、阴影及颜色倾斜)示例 */ 2. osg::ref_ptr<osg::Camera> createAllKindText(const string &strDataFolder) 3. {…

华为云cce中环境变量的使用

如上图&#xff0c;cce中的环境变量可配置。 配置后的这些参数怎么用呢&#xff1f; 我们可以在docker打包前在springboot的配置文件中配置&#xff0c;cce在启动的时候会调用环境变量中的设置。 如上图&#xff0c;配置的东西以key值标记&#xff0c;冒号后面的是默认配置项…

YOLO改进系列之注意力机制(GatherExcite模型介绍)

模型结构 尽管在卷积神经网络&#xff08;CNN&#xff09;中使用自底向上的局部运算符可以很好地匹配自然图像的某些统计信息&#xff0c;但它也可能阻止此类模型捕获上下文的远程特征交互。Hu等人提出了一种简单&#xff0c;轻量级的方法&#xff0c;以在CNN中更好地利用上下…

ssm+vue的药店药品信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的药店药品信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

Run Legends将健身运动游戏化,使用户保持健康并了解Web3游戏

最近&#xff0c;我们有机会采访Talofa Games的首席执行官兼创始人Jenny Xu&#xff0c;一起讨论游戏开发&#xff0c;Talofa Games是Run Legends这款健身游戏的开发工作室。她已经创作了超过一百款游戏&#xff0c;对于推动游戏的可能性并将她的创造力和叙事技巧带入她最喜爱的…