当前位置: 首页 > news >正文

回溯问题总结

一、子集问题

模板问题

给定一个序列[1,n],求这个序列的所有子集

输入描述:

一个正整数n(1 <= n <= 12)

输出描述:

每个子集一行,输出所有子集。

输出顺序为:

(1)元素个数少的子集优先输出;

(2)元素个数相等的两个子集A和B,若各自升序后满足前k−1项对应相同,但有Ak<Bk,那么将子集A优先输出(例如[1,5,9]比[1,5,10]优先输出)。

在输出子集时,子集内部按升序输出,子集中的每个数之间用一个空格隔开,行末不允许有多余的空格;空集用空行表

示。不允许出现相同的子集。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 13;vector<vector<int>> ans;
vector<int> temp;void dfs(int start, int n) {ans.emplace_back(temp);  // 将当前子集添加到结果中for (int i = start; i <= n; ++i) {  // 修改循环条件为 <= 以包含 ntemp.push_back(i);dfs(i + 1, n);temp.pop_back();}
}bool compare(vector<int> &a,vector<int> &b) {if (a.size() != b.size()) {return a.size() < b.size();}else {return a < b;}
}int main() {int n;scanf("%d", &n);dfs(1,n);sort(ans.begin(), ans.end(), compare);for (int i = 0; i < ans.size(); i++) {for (int j = 0; j < ans[i].size(); j++) {printf("%d", ans[i][j]);if (j + 1 < ans[i].size()) {printf(" ");}}printf("\n");}return 0;
}

变题:

小晴来参加一个游园会。游园会中有n个游戏项目,每个项目有且仅有一次参与机会,如果成功完成了任意一个项目,就能得到对应的积分;如果失败了,则积分不会发生变化。在游园会的出口可以用累计积分兑换奖品。小晴参与了所有项目,问最后小晴的累计积分有哪些可能。

输入描述

第一行一个正整数n(1≤n≤12),表示游戏项目的个数。

第二行为n个不超过100的正整数,表示每个游戏项目在成功完成后分别能获得多少积分。

输出描述

在一行内按升序输出所有不同的累计积分,数字之间用一个空格隔开,行末不允许有多余的空格。

同样是子集问题,为什么可以这么理解呢?因为对于小晴来说,他赢了可以拿对应的分,如果没有赢那么就不能选这个分加入结果,这不就是子集问题吗?

#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;const int N = 13;
int a[N];
int n;
int path = 0;
set<int> res;// 子集问题void dfs(int start) {res.insert(path);  // 每次进入递归就把结果加入res中for (int i = start; i < n; ++i) {path += a[i];    dfs(i+1);path -= a[i];  // 回溯}
}int main() {scanf("%d",&n);for (int i = 0; i < n; ++i) {scanf("%d",&a[i]);}dfs(0);int idx = 0;for (set<int>::iterator it = res.begin(); it != res.end(); it++) {printf("%d", *it);printf(idx + 1 < res.size() ? " " : "\n");idx++;}return 0;
}

二、排列问题

题目描述

给定一个正整数n,假设序列S=[1,2,3,…,n],求S的全排列。

输入描述

一个正整数n(1≤n≤8)。

输出描述

每个全排列一行,输出所有全排列。

输出顺序为:两个全排列A和B,若满足前k−1项对应相同,但有Ak<Bk,那么将全排列A优先输出(例如[1,2,3]比[1,3,2]优先输出)。

在输出时,全排列中的每个数之间用一个空格隔开,行末不允许有多余的空格。不允许出现相同的全排列。

#include <cstdio>
#include <vector>
using namespace std;const int MAXN = 8 + 1;
vector<vector<int> > result;
vector<int> path;
int n;
bool used[MAXN] = {false};void DFS(int idx) {if (idx == n + 1) {  result.push_back(path);return;}for (int i = 1; i <= n; i++) {if (!used[i]) {  // 这个数还没有选过进行选择path.push_back(i);used[i] = true;DFS(idx + 1);   // 此处的idx实际上是用来控制递归次数的used[i] = false;path.pop_back();}}
}int main() {scanf("%d", &n);DFS(1);for (int i = 0; i < result.size(); i++) {for (int j = 0; j < result[i].size(); j++) {printf("%d", result[i][j]);if (j != result[i].size() - 1){printf(" ");}}printf("\n");}return 0;
}

 变题:

题目描述

给定一个长度为n的序列,其中有n个可能重复的正整数,求该序列的所有全排列。

输入描述

第一行一个正整数n(1≤n≤8),表示序列中的元素个数。

第二行按升序给出n个可能重复的正整数(每个正整数均不超过100)。

输出描述

每个全排列一行,输出所有全排列。

输出顺序为:两个全排列A和B,若满足前k−1项对应相同,但有Ak<Bk,那么将全排列A优先输出(例如[1,2,3]比[1,3,2]优先输出)。

在输出时,全排列中的每个数之间用一个空格隔开,行末不允许有多余的空格。不允许出现相同的全排列。

看题目很明显还是排列问题,但是在这题中会有重复数字,比如我给出一个实例

输入:1,1,3,4

输出:1(第一个1),1(第二个1),3,4 和 1(第二个1),1(第一个1),3,4,是同一个排列

那么我们就需要剪枝了

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int MAXN = 8 + 1;
vector<vector<int> > result;
vector<int> temp;
int n, a[MAXN];
bool used[MAXN] = {false};void DFS(int idx) {if (idx == n) {result.push_back(temp);return;}for (int i = 0; i < n; i++) {if (i > 0 && a[i] == a[i - 1] && used[i - 1] == false) {continue;}if (!used[i]) {temp.push_back(a[i]);used[i] = true;DFS(idx + 1);used[i] = false;temp.pop_back();}}
}int main() {cin >> n;  for (int i = 0; i < n; i++) {cin >> a[i];  }DFS(0);sort(result.begin(), result.end());for (int i = 0; i < result.size(); i++) {for (int j = 0; j < result[i].size(); j++) {cout << result[i][j];  if (j + 1 < result[i].size()) {cout << " ";  } else {cout << endl;  }}}return 0;
}

三、组合问题

题目描述

给定两个正整数n、k,假设序列S=[1,2,3,…,n],求从S中任选k个的所有可能结果。

输入描述

两个正整数n、k(1≤k≤n≤12)。

输出描述

每个组合一行,输出所有组合。

输出顺序为:两个组合A和B,若各自升序后满足前k−1项对应相同,但有Ak<Bk,那么将组合A优先输出(例如[1,5,9]比[1,5,10]优先输出)。

在输出组合时,组合内部按升序输出,组合中的每个数之间用一个空格隔开,行末不允许有多余的空格。不允许出现相同的组合

#include <cstdio>
#include <vector>
using namespace std;vector<vector<int> > result;
vector<int> temp;
int n, k;void DFS(int idx) {if (temp.size() == k) {result.push_back(temp);return;}for (int i = idx; i <= n; ++i) {temp.push_back(i);DFS(i+1);temp.pop_back();}
}int main() {scanf("%d%d", &n, &k);DFS(1);for (int i = 0; i < result.size(); i++) {for (int j = 0; j < result[i].size(); j++) {printf("%d", result[i][j]);printf(j + 1 < result[i].size() ? " " : "\n");}}return 0;
}

 变题:

题目描述

给定n个互不相同的正整数,从中选择若干个数(每个数只能选一次),使得这些数之和为定值K。求满足条件的方案数。

输入描述

第一行两个正整数n、K(1≤n≤12、1≤K≤128),分别表示整数个数与定值。

第二行按升序给出n个互不相同的正整数(每个正整数均不超过128)。

输出描述

输出满足条件的方案数。相同数字算作同一种方案,例如{2,3}和{3,2}是同一个方案(仅顺序不同)。

 这题显然是个组合问题,只是再原有的组合问题的基础上又提出了新的要求,即:和要为定制k

可以按照组合问题的模板来套,不过需要改变的是递归出口

#include <cstdio>
#include <vector>
using namespace std;int n,k;
const int N = 13;
int a[N];
int curr = 0;
int cnt;void dfs(int start) {if (curr > k) {return;}if (curr == k) {cnt++;return;}for (int i = start; i < n; ++i) {curr += a[i];dfs(i+1);curr -= a[i];}
}int main() {scanf("%d%d",&n,&k);for (int i = 0; i < n; ++i) {scanf("%d",&a[i]);}dfs(0);printf("%d",cnt);return 0;}

相关文章:

回溯问题总结

一、子集问题 模板问题 给定一个序列[1,n],求这个序列的所有子集 输入描述&#xff1a; 一个正整数n(1 < n < 12) 输出描述&#xff1a; 每个子集一行&#xff0c;输出所有子集。 输出顺序为&#xff1a; &#xff08;1&#xff09;元素个数少的子集优先输出&#xff1b;…...

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…...

.net # 检查 带有pdf xss

1.解决pdf含javasprct脚本动作&#xff0c;这里是验证pdf内部事件。相关pdf文件下载&#xff1a; 测试pdf文件 相关包 iTextSharp 5.5.13.4 iTextSharp using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser;private Boolean IsPdfSafe(Stream stream){// PdfReader…...

【React】探讨className的正确使用方式

文章目录 一、className的正确用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中&#xff0c;正确使用className属性对组件进行样式设置至关重要。然而&#xff0c;由于JavaScript和JSX的特殊性&#xff0c;开发者常常会犯一些小错误&…...

打靶记录5——靶机hard_socnet2

靶机&#xff1a; https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标&#xff1a; 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...

独立站+TikTok达人:自主营销与创意内容的完美结合

在全球电商市场迅猛发展的今天&#xff0c;独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台&#xff0c;其自主性和灵活性为商家提供了广阔的发展空间&#xff1b;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础&#xff0c;成为推动销售…...

【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案

健康生活理念不断深入人心&#xff0c;多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展&#xff0c;启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案&#xff0c;旨在提升养生壶与茶吧机的用户体验与操…...

WAF绕过技术(PKAV团队)

目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...

『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型

文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...

python中的字符串方法

python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...

python实现consul的服务注册与注销

我在使用consul的时候主要用于prometheus的consul服务发现&#xff0c;把数据库、虚拟机信息发布到consul&#xff0c;prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后&#xff0c;安装consul请参考二进制方式部署consul…...

校园选课助手【2】-重要的登录模块

用户登录模块技术要点&#xff1a; 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释&#xff1a; 1.使用 MD5 二次加密用户登录信息&#xff0c;前端先通过密码加上盐进行MD5加密交给服务器&a…...

4章2节:从排序到分组和筛选,通过 R 的 dplyr 扩展包来操作

dplyr是R语言中一个强大且高效的数据处理包,专门设计用于处理数据框(data frames)。它的语法简洁明了,操作高效,尤其适用于大数据集。dplyr提供了一系列函数,使得数据的筛选、变换、聚合和排序等操作变得简单直观。本文将详细介绍dplyr扩展包如何进行数据的排序到分组和筛…...

C语言实现 -- 单链表

C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前&#xff0c;我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1&#xff1a;移除…...

WSL和Windows建立TCP通信协议

1.windows配置 首先是windows端&#xff0c;启动TCP服务端&#xff0c;用来监听指定的端口号&#xff0c;其中IP地址可以设置为任意&#xff0c;否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据&#xff0c;其中…...

Android Gradle开发与应用(一):Gradle基础

文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务&#xff08;Tasks&#xff09; 三、Gradle在Android项目中的深入应用1. 构建变体&#xff08;Build Variants&#xff09;2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...

Linux多线程服务器编程-1-线程安全的对象生命期管理

对象的生与死不能由对象自身拥有的mutex&#xff08;互斥器&#xff09;来保护. 如何避免对象析构时可能存在的race condi​t​ion&#xff08;竞态条件&#xff09;是C多线程编程面临的基本问题。 对象的销毁可能出现多种竞态条件(race condi​t​ion)&#xff1a; 在即将析构…...

Couchbase 技术详解

文章目录 Couchbase 原理数据模型数据分布数据访问与同步官网链接 基础使用安装与配置数据操作 高级使用数据分片与负载均衡数据索引与查询安全性与权限管理 优点高性能可扩展性高可用性灵活性 总结 Couchbase 是一个高性能、分布式、可扩展的 NoSQL 数据库系统&#xff0c;基于…...

PTE-信息收集

一、渗透测试流程 渗透测试通常遵循以下六个基本步骤&#xff1a; 前期交互&#xff1a;与客户沟通&#xff0c;明确测试范围、目标、规则等。信息收集&#xff1a;搜集目标系统的相关信息。威胁建模&#xff1a;分析目标系统可能存在的安全威胁。漏洞分析&#xff1a;对收集…...

委外订单执行明细表增加二开字段

文章目录 委外订单执行明细表增加二开字段业务背景业务需求方案设计详细设计扩展《委外订单执行明细表》扩展《委外订单执行明细过滤》创建插件&#xff0c;并实现报表逻辑修改创建插件&#xff0c;添加引用创建类&#xff0c;继承原数据源类ROExecuteDetailRpt报表挂载插件 委…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...