回溯法、全排列、子集等

回溯法

感想:回溯算法本质是一个循环,有点像while循环

一些回溯法(递归)的经典应用

1.全排列
2.子集

其实上面两个点,也是对应着高中数学里面的“排列”与“组合”

1.全排列问题

给定一个集合S{a,b,c},把其中元素按照不同顺序进行排序,eg.“abc”,“bca”,“cab”…全排列的结果为n!个。

基本思想是树(解答树)的遍历,如果是使用dfs(暴搜),那么可以使用递归来写。

在这里插入图片描述

解答树
/*
暴力全排列的思路是:
维护一个path容器,用来装选择好的内容,从集合S中获取元素[i],然后查询path中是否存在[i],如果不存在,跳过该元素,遍历下一个,如果[i]在path中不存在,则将[i]放入path中。
不断重复这个过程,使用dfs进行纵向遍历,使用for循环进行横向遍历。
*/
//伪代码
void dfs(int k){//k层数if(k = n) save(path);//保存path,也就是保存一个答案else{//用else省一个return语句for(int i = 0; i < n; i++){if(!check(S[i])){//检查S[i]是否在path中存在state.set(S[i]) = true;//path.add(S[i]);dfs(k+1);//向下遍历state.set(S[i]) = false;//去掉该元素,为下一个元素放置做好准备(元素+状态的还原)path.remove(S[i]);}}}
}
//样例代码见package cjm.recursion.full_permutation;
2.子集

子集问题描述:使用集合S{1,2,3}中的元素构建新的集合,每个元素只能使用一次,元素一样的集合只算一个,eg.{1,2},{2},{1,2,3}…

其实这个子集问题的本质就是高中学到的组合问题,n个元素有几种组合方式,答案数量为C(n,m);

增量构造法
/*
思路:与全排列的算法框架类似,也是对解答树进行遍历,不过不同点在于每一次遍历时都要将path加入答案集ans{},而且将S[i]放到前缀后时所需的判断也是不一样的。具体来说,[i]如果不在path中,且前缀+[i]构成的新集合如果不在答案集中,那么可以将[i]放入path中,并进行遍历。
本质还是dfs纵向遍历+for的横向遍历。
*/
void dfs(int k){//y总那边用的是ufor(int i = 0; i < n; i++){if(!check(S[i])){//检查S[i]是否满足条件([i]属于path,path+[i]属于ans)setState(S[i]);//更新状态,包括将元素加入path,更新新集合在ans的存在等等dfs(k+1);//向下遍历reState(S[i]);//恢复状态}}}
位向量法

先空着,有空再学再写

二进制法

先空着,有空再学再写

引用:紫书

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现WPF中的数据更新 属性通知界面:INotifyPropertyChanged接口

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;当数据发生变化时&#xff0c;通常希望UI能够自动更新以反映这些变化。为了实现这一功能&#xff0c;WPF 提供了数据绑定机制&#xff0c;并且配合 INotifyPropertyChanged 接口使用&#xff0c;可以在数据模型…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第3章 Ubuntu20.04系统设置

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

RFID工业读写器在危化品储存管理的优势有哪些?

在化学品和危险品储存管理领域&#xff0c;传统的管理方式通常存在一些痛点和挑战&#xff1a;化学品和危险品的管理主要依赖于人工记录和监控&#xff0c;容易出现数据不准确、遗漏、混淆等问题&#xff0c;导致安全隐患和管理困难。化学品和危险品的存储和管理涉及到一系列安…

XTuner笔记

为什么要微调&#xff1a; 1. 模型不具备一些私人定制的知识 2。模型回答问题的套路你不满意。 对应衍生出来两种概念 增量预训练微调&#xff1a; 使用场景&#xff1a;让基座模型学习到一些新知识&#xff0c;如某个垂类领域的常识训练数据&#xff1a;文章、书籍、代码等…

护眼台灯和普通台灯差别很大吗?专业护眼灯品牌有哪些?

随着科技的不断演进&#xff0c;台灯的设计也日益脱胎换骨&#xff0c;从曾经的笨重造型转变为如今轻盈雅致的外观。它们的功能同样经历了多样化的革新&#xff0c;变得更加人性化和便捷。作为学习、阅读和办公环境中不可或缺的照明工具&#xff0c;台灯所提供的光线舒适度至关…

寻找最大价值的矿堆 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图…

blender 制作圆角立方体模型,倒角实现。cocos 使用。导出fbx

图片&#xff1a; 步骤&#xff1a; 1.首先创建一个立方体&#xff0c;这里可以使用默认的立方体。 2.在属性面板选择如“扳手”图标一样的修改器工具。 3.设置数量和段数实现圆角的圆滑效果&#xff0c;没有菱角。 保存导出相关的教程&#xff1a;

2024HW Linux应急响应基础学习

首先展示关于Linux的关键目录&#xff0c;这是应急响应查看的关键&#xff1a; 常用命令 top //查看进程资源的占用情况 ps -aux //查看进程 直接写ps aux也可以 netstat -antpl //查看网络连接 ls -alh /proc/pid //查看某个pid对应的可执行程序 pid记得修改 lsof /…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):Lab01 神经元和层

目录 导入Tensorflow的库无激活函数 vs 有激活函数&#xff1f;1.无激活函数2.有激活函数 无激活函数的神经元-回归/线性模型1.创建训练集散点图2.创建层3.层输入4.获取层参数5.层参数的形状6.手动设置层的参数7.层计算vs线性回归模型计算 有激活函数sigmoid的神经元1.创建训练…

【FX110】台湾修改洗钱法已加强对虚拟资产的监管

台湾正在通过修订《洗钱控制法》加强其反洗钱法规&#xff0c;使其法律与亚太反洗钱组织 (APG) 制定的国际标准保持一致。 此次修正案的重点是将虚拟资产和虚拟资产服务提供商置于台湾反洗钱制度的严格监管之下。修订后的法律对“虚拟资产”和“虚拟资产服务提供商”增加了明确…

CH340 RTS DTR引脚编程驱动OLED

我们常用的四线OLED就是IIC通信的&#xff0c;那么我们能不能用ch340来模拟一个IIC呢&#xff0c;当然可以我移植了中景园的OLED驱动&#xff0c;接下来就是见证奇迹的时刻&#xff0c;成功点亮&#xff0c;受限于CH340的引脚速度&#xff0c;模拟IIC的通信速度只有3k左右 注意…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …