回溯问题总结
一、子集问题
模板问题
给定一个序列[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],求这个序列的所有子集 输入描述: 一个正整数n(1 < n < 12) 输出描述: 每个子集一行,输出所有子集。 输出顺序为: (1)元素个数少的子集优先输出;…...
GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库
使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍(不得不吐槽下,官方代码有很多遗留问题,他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上),经过了大量的查阅各种资料以…...
.net # 检查 带有pdf xss
1.解决pdf含javasprct脚本动作,这里是验证pdf内部事件。相关pdf文件下载: 测试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开发中,正确使用className属性对组件进行样式设置至关重要。然而,由于JavaScript和JSX的特殊性,开发者常常会犯一些小错误&…...
打靶记录5——靶机hard_socnet2
靶机: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标: 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...
独立站+TikTok达人:自主营销与创意内容的完美结合
在全球电商市场迅猛发展的今天,独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台,其自主性和灵活性为商家提供了广阔的发展空间;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础,成为推动销售…...
【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
健康生活理念不断深入人心,多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展,启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案,旨在提升养生壶与茶吧机的用户体验与操…...
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服务发现,把数据库、虚拟机信息发布到consul,prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后,安装consul请参考二进制方式部署consul…...
校园选课助手【2】-重要的登录模块
用户登录模块技术要点: 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释: 1.使用 MD5 二次加密用户登录信息,前端先通过密码加上盐进行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.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…...
WSL和Windows建立TCP通信协议
1.windows配置 首先是windows端,启动TCP服务端,用来监听指定的端口号,其中IP地址可以设置为任意,否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据,其中…...
Android Gradle开发与应用(一):Gradle基础
文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务(Tasks) 三、Gradle在Android项目中的深入应用1. 构建变体(Build Variants)2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...
Linux多线程服务器编程-1-线程安全的对象生命期管理
对象的生与死不能由对象自身拥有的mutex(互斥器)来保护. 如何避免对象析构时可能存在的race condition(竞态条件)是C多线程编程面临的基本问题。 对象的销毁可能出现多种竞态条件(race condition): 在即将析构…...
Couchbase 技术详解
文章目录 Couchbase 原理数据模型数据分布数据访问与同步官网链接 基础使用安装与配置数据操作 高级使用数据分片与负载均衡数据索引与查询安全性与权限管理 优点高性能可扩展性高可用性灵活性 总结 Couchbase 是一个高性能、分布式、可扩展的 NoSQL 数据库系统,基于…...
PTE-信息收集
一、渗透测试流程 渗透测试通常遵循以下六个基本步骤: 前期交互:与客户沟通,明确测试范围、目标、规则等。信息收集:搜集目标系统的相关信息。威胁建模:分析目标系统可能存在的安全威胁。漏洞分析:对收集…...
委外订单执行明细表增加二开字段
文章目录 委外订单执行明细表增加二开字段业务背景业务需求方案设计详细设计扩展《委外订单执行明细表》扩展《委外订单执行明细过滤》创建插件,并实现报表逻辑修改创建插件,添加引用创建类,继承原数据源类ROExecuteDetailRpt报表挂载插件 委…...
“数字孪生+大模型“:打造设施农业全场景数字化运营新范式
设施农业是一个高度复杂和精细化管理的行业,涉及环境控制、作物生长、病虫害防治、灌溉施肥等诸多环节。传统的人工管理模式已经难以应对日益增长的市场需求和管理挑战。智慧农业的兴起为设施农业带来了新的机遇。将前沿信息技术与农业生产深度融合,实现农业生产的数字化、网络…...
zeppline 连接flink 1.17报错
Caused by: java.io.IOException: More than 1 flink scala jar files: /BigData/run/zeppelin/interpreter/flink/zeppelin-flink-0.11.1-2.12.jar,/BigData/run/zeppelin/interpreter/flink/._zeppelin-flink-0.11.1-2.12.jar 解决方案: 重新编译zepplin代码&…...
【机器视觉】【目标检测】【面试】独家问题总结表格
简述anchor free和anchor boxanchor free是对gt实际的左上和右下的点做回归,anchor box是对辅助框即锚框做回归说说对锚框的理解锚框是辅助框, 可以通过预设的长宽比设定,也可以通过k-means算法聚类数据集得到目标检测的指标MAP,FLOPS,FPS,参数量简述非极大值抑制(NMS)非极大…...
从零开始,快速打造API:揭秘 Python 库toapi的神奇力量
在开发过程中,我们常常需要从不同的网站获取数据,有时候还需要将这些数据转化成API接口提供给前端使用。传统的方法可能需要大量的时间和精力去编写代码。但今天我要介绍一个神奇的Python库——toapi,它可以让你在几分钟内创建API接口&#x…...
如何理解复信号z的傅里叶变换在频率v<0的时候恒为0,是解析信号
考虑例子2.12.1的说法。 首先我尝试解释第二个说法。需要注意一个事实是 实函数f的傅里叶变换F的实部是偶函数,虚部是奇函数。如图所示: 注意的是这个图中虽然是离散傅里叶变换的性质,但是对于一般的傅里叶变换的性质是适用的。 推导过程如下…...
大型赛事5G室内无线网络保障方案
大型活动往往才是国家综合实力的重要体现,其无线网络通信保障工作需融合各类新兴的5G业务应用,是一项技术难度高、方案复杂度高的系统工程。尤其在活动人员复杂、现场突发情况多、网络不稳定等情况下,如何形成一套高效、稳定的应急通信解决方…...
windows 2012域服务SYSVOL复制异常
这边文章是我多年前在BBS提问的,后来有高手回答,我把他保存了下来,最近服务器出现问题,终于有翻出来了!发出来希望能帮到更多人。 问题 我的环境,windows 2012。最近改了一些域策略,发现没有正…...
动态规划,蒙特卡洛,TD,Qlearing,Sars,DQN,REINFORCE算法对比
动态规划(Dynamic Programming, DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划的步骤 识别子问题:定义问题的递归解法,识别状态和选择。确定DP数组:确定存储子问题解的数据结构ÿ…...
HarmonyOS开发商城商品详情页
目录 一:功能概述 二:代码实现 三:效果图 一:功能概述 这一节,我们实现商品详情页的开发,具体流程就是在首页的商品列表点击商品跳转到商品详情页面,同时传递参数到该页面,通过参数调用商品详情接口在详情页展示商品的的详情信息。这里我们为了方便返回首页,在最顶…...
OS_操作系统的运行环境
2024.06.11:操作系统的运行环境学习笔记 第3节 操作系统的运行环境 3.1 操作系统引导3.2 操作系统内核3.2.1 内核资源管理3.2.2 内核基本功能 3.3 CPU的双重工作模式3.3.1 CPU处于用户态(目态)3.3.2 CPU处于内核态(管态) 3.4 特权…...
市场调查与预测网站建设/微信crm管理系统
import sysdef check_ip(num):"""检查IP"""num = int(num)if 0 <= num <= 255:passelse:raise Except...
有没有如何做网站的书/可以看封禁网站的浏览器
中国零售巨头阿里巴巴(BABA.US)旗下的云计算部门(简称阿里云),近日开设首家英国数据中心,并在伦敦设有两个运营点。 据了解,英国大区上线了众多云计算产品,包括弹性计算、云存储、数…...
西安北郊做网站公司/唐山seo快速排名
链接:题目 来源:牛客网 处女座的期末复习 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 快要期末考试了,处女座现在有n门课程需要…...
迈创网站建设/友链交换
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以照片为例,16:9尺寸的照片是指长边与短边之比是16:9,与照片像素的多与少没有关系,例如可以是长边是160像素、短边是90像素…...
自己怎么做百度网站/深圳网站seo推广
迎接县均衡化国家验收学校解说词办学条件组尊敬的各位专家、各位领导:欢迎莅临我校检查指导工作。我们宁津县第二实验小学始建于1997年,是一所县属非寄宿完全小学。当时只有北面这一座楼,29名教师。2012年秋季扩建,建成南面这座教…...
网页设计基础教程视频教程/seo优化裤子关键词
qt中有时候使用new后并没有使用delete,原因是 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 #include "mainwindow.h" #include <QApplication> #include <QTextCodec> #include <QLabel> int main(int argc, char *argv[…...