8-1 回溯法实验报告 (15 分)(思路+详解)

一:题目

给定k个正整数,用算术运算符+,-,,/ 将这k个正整数连接起来,是最终的得数恰为m。
如果有多组满足要求的表达式,只要输出一组,每一步算式用分号隔开。
如果无法得到m,得输出“No Solution”。
样例输入:d
5 125
7 2 2 12 3
第一行输入整数的个数k和m,
第二行输入k个整数。
这只是其中一种结果
样例输出: 7
3=21 21*12=252 252-2=250 250/2=125

二:思路:

1.排列树 + 子集树
2.我们穷举所有的可能的数字组合,这是全排列,但要注意的是在全排列中,如果给出的数据有重复的数字,那么我们求的全排列后的数据是有重复的,所以我们要进行去重处理;
3.得到全排列的结果后,我们要对每一个全排列的结果进行子集树处理,因为每一次往下递归都是’+’,’-’,’*’,’/’;,递归的终止条件就是当我们统计 sum == M时候,或者是我们的操作符个数满足要求的时候,如果仅仅是操作符满足个数是不统计操作符的结果的;
在这里插入图片描述

二:上码

/*
1.题目:   
给定k个正整数,用算术运算符+,-,*,/ 将这k个正整数连接起来,是最终的得数恰为m。 
如果有多组满足要求的表达式,只要输出一组,每一步算式用分号隔开。
如果无法得到m,得输出“No Solution”。 
样例输入:
5 125
7 2 2 12 3 
第一行输入整数的个数k和m,
第二行输入k个整数。 
样例输出: 7*3=21 21*12=252 252-2=250 250/2=1252.思路分析:
从输出的样例顺序(7,3,12,2,2)可以得知,这是一种全排列后的结果,对于每组数据之间的加减乘除,我们
可以做子集树划分 */#include<bits/stdc++.h>
using namespace std;int N,M;
int cnt = 0; 
vector<vector<int> >ans1;
vector<int> path1;vector<vector<char> >ans2;
vector<char> path2;//求出数字的全排列组合 
void backtacking1(int N,vector<int>& vec,vector<bool>& vis){if(path1.size() == N){ans1.push_back(path1);return;}for(int i = 0; i < N; i++){if(vis[i] == true) continue;vis[i] = true;path1.push_back(vec[i]);backtacking1(N,vec,vis);path1.pop_back();vis[i] = false;}
}//子集树的排列
//横向的for循环为加减乘除,纵向的为一种全排列的结果 
void backtacking2(vector<char>& v1,vector<int>& v2,int sum,int index){if(sum == M || path2.size() == N - 1){  //这里递归结束的条件为满足 M时 if(sum == M){                      //还有的是操作符号的个数不能大于 N - 1个 ans2.push_back(path2);cnt = 1;}return ;	}for(int i = 0; i < 4; i++){//这里小于4是有4个操作符 char ch = v1[i];if(ch == '+'){sum = sum + v2[index];}else if(ch == '-'){sum = sum - v2[index];}else if(ch == '*'){sum = sum * v2[index];}else if(ch == '/'){sum = sum / v2[index];}index++;//表示纵向的一种全排列结果集的下标 path2.push_back(ch);//将符号存进去 backtacking2(v1,v2,sum,index);//这里的顺序不能乱 path2.pop_back();index--;if(ch == '+'){sum = sum - v2[index];}else if(ch == '-'){sum = sum + v2[index];}else if(ch == '*'){sum = sum / v2[index];}else if(ch == '/'){sum = sum * v2[index];}	 			}
} //验证全排列 
void text01(){ for(int i = 0; i < ans1.size(); i++){for(int j = 0; j < N; j++){cout << ans1[i][j] << " ";}cout << endl;}
}int main(){vector<int>v1;//输入的数据vector<vector<int> >v3;//记录可行解 vector<char> operators(4); set<int>s[100]; set<int>:: iterator st;cin >> N >> M;for(int i = 0; i < N; i++){int num;cin >> num;v1.push_back(num);}cout << endl; vector<bool> vis(N,false); backtacking1(N,v1,vis); operators[0] = '+';operators[1] = '-';operators[2] = '*';operators[3] = '/';for(int i = 0; i < ans1.size(); i++){vector<int> v2;int count = 0; 		for(int j = 0; j < N; j++){			v2.push_back(ans1[i][j]);if(ans1[i-1][j] == ans1[i][j] && i != 0){count++;	                   }	}if(count == N){ // 这是为了去重的,因为在全排列中,如果有重复的元素,那么最终输出 continue;  //的结果是有重复的组数据的 }int num = v2[0];backtacking2(operators,v2,num,1);if(cnt == 1){//这里存的是满足条件的 数字组合 v3.push_back(v2);}	cnt = 0;}for(int i = 0; i < ans2.size(); i++){//v3.size() 和ans2.size()大小是一致的 cout << "操作数为:";for(int j = 0; j < N; j++){cout << v3[i][j] << ' ';}cout << endl;cout << "操作符为:"; for(int j = 0; j < N - 1; j++){//N个数需要 N-1个操作符 cout << ans2[i][j] << ' ';}cout << endl;}} //5 125
//7 3 12 2 2//5 125
//7 2 2 12 3

下方的的数据按照操作符都可以得到正确结果
在这里插入图片描述

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

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

相关文章

TypeScript 4.0 发布

喜欢就关注我们吧&#xff01;整体看来&#xff0c;此版本在兼容性方面没有特别大的变化。因为 TypeScript 团队表示新版本继续使用与过去版本相似的版本控制模型&#xff0c;可将 4.0 视作 3.9 的延续升级版本。而且他们也一直在追求不牺牲主要灵活性的情况下&#xff0c;提供…

『软件工程5』详解软件项目管理之软件的度量

软件项目管理——软件的度量一、度量的目的1、引例2、度量的目的3、度量的作用二、测量、度量和指标区别1、引例2、测量、度量和指标的区别3、思考题三、过程度量和项目度量1、过程2、项目四、度量的方式1、物理世界中的测量2、软件测量五、面向规模的度量1、定义2、有用度量的…

7-2 旅行售货员 (10 分)(TSP问题思路加详解)

一题目 某售货员要到若干城市去推销商品&#xff0c;已知各城市之间的路程(或旅费)。他要选定一条从驻地出发&#xff0c;经过每个城市一遍&#xff0c;最后回到驻地的路线&#xff0c;使总的路程&#xff08;或总旅费&#xff09;最小。 输入格式: 第一行为城市数n 下面n行…

从零开始内建你的安全测试流程

一、 安全测试的意义安全问题&#xff0c;没发生的时候我们可以侥幸&#xff0c;一旦发生生产安全问题&#xff0c;对很多公司来说可能就是黑天鹅事件了。平台的安全&#xff0c;是我们测试中不可舍弃的一环&#xff0c;而且需要长期持续的关注。二、 从哪里入手很多公司没有专…

『软件测试1』你需要了解的软件测试基础知识

软件测试基础一、 软件缺陷的概述1、什么是软件缺陷2、软件缺陷的类型3、软件缺陷的案例4、软件缺陷的产生原因5、软件缺陷的分类6、软件缺陷的处理流程7、多学一招&#xff1a;缺陷报告&#xff08;由测试人员完成&#xff09;8、常见软件缺陷管理工具9、修复软件缺陷的成本二…

直连路由和静态路由(实验)

一:概念 1:直连路由概念 根据 路由 器学习路由信息、生成并维护 路由表 的方法包括直连路由(Direct)、 静态路由 (Static)和 动态路由 (Dynamic)。直连路由&#xff1a;路由器接口所连接的子网的路由方式称为直连路由&#xff1b; 非直连路由&#xff1a;通过路由协议从别的路…

使用 GB28181.Solution + ZLMediaKit + MediaServerUI 进行摄像头推流和播放

使用 GB28181.Solution ZLMediaKit MediaServerUI 进行摄像头推流和播放独立观察员 2020 年 8 月 25 日一、摄像机 GB28181 配置打开 国标 28181 配置页面&#xff0c;勾上 “接入使能”&#xff1a;打钩的是重要的配置信息&#xff0c;主要就是 SIP 服务器的信息和摄像头自己…

将 .NET Framework 项目转换为 .NET Standard 项目

将 .NET Framework 项目转换为 .NET Standard 项目独立观察员 2020 年 8 月 20 日如今 .NET Core 是未来发展的主流&#xff08;至少在 .NET 5 发布之前&#xff09;&#xff0c;而我们如果要改造一个项目为 .NET Core 项目&#xff0c;则它引用的项目应当先改造为 .NET Standa…

7-3 最短路径 (20 分)(分支限界+思路+详解)

一&#xff1a;题目 给定一个有N个顶点和E条边的无向图&#xff0c;顶点从0到N−1编号。请判断给定的两个顶点之间是否有路径存在。如果存在&#xff0c;给出最短路径长度。 这里定义顶点到自身的最短路径长度为0。 进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&a…

一份【软件工程】的学习指南已到达,请注意查收!!

软件工程——起始篇一、引言二、学习【软件工程】的原因1、软件设计师证书2、相关领域人员必备技能三、【软件工程】的学习方法1、不要盲目为了学习而学习2、规划学习路线四、结束语【软件工程】应该是大学计算机专业必修的一门课&#xff0c;对于开发者来说&#xff0c;可能有…

『软件工程6』详解软件项目管理之软件范围与估算

软件项目管理——软件范围与估算一、软件项目计划1、目标2、步骤二、软件范围1、软件范围定义2、软件范围——引例三、影响估算的因素四、软件项目资源1、软件项目资源构成2、分析图3、人力资源4、硬件资源5、软件工具6、可复用构件五、软件工作量与成本的估算1、基于LOC估算工…

【翻译】.NET 5 Preview8发布

今天&#xff0c;.NET 5预览8发布了&#xff0c;对于.NET5.0的功能开发已经完成了&#xff0c;这必须要排除待处理的bug&#xff0c;预览8是最后一次预览版本。预计11月正式的.NET5.0版本发布之前还将发布两个正式之前的候选版本&#xff0c;这篇文章描述了.NET5.0版本中的一系…

7-1 页面置换算法--FIFO (50 分)(思路详解)

一:题目 先初始化页面大小&#xff0c;和物理块数。连续输入页面的逻辑地址&#xff0c;以“-1”作为结束标志&#xff0c;采用FIFO页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移&#xff0c;若该页不在内存&#xff0c;并且还有剩余的物理块&#xff…

7-2 页面置换算法--LRU (50 分)

一:题目(思路详解运行时错误解决) 先初始化页面大小&#xff0c;和物理块数。连续输入页面的逻辑地址&#xff0c;以“-1”作为结束标志&#xff0c;采用LRU页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移&#xff0c;若该页不在内存&#xff0c;并且还…

『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!

文章目录一、等价类划分法1、定义2、等价类划分法步骤3、设计测试用例步骤4、案例&#xff1a;学生选修课程二、边界值分析法1、边界值分析法概述2、设计测试用例3、边界值设计原则三、错误推测法1、错误推测法概述2、错误推测法基本思想四、因果图设计法1、因果图设计法概述2、…

使用Jenkins来发布和代理.NetCore项目

Back toStudy!注&#xff1a;书接上文&#xff0c;上回《【CI/CD系列】使用Docker安装Jenkins》咱们说到了使用Docker镜像的方式&#xff0c;来建立Jenkins服务&#xff0c;用来持续集成和持续发布项目&#xff0c;但是上一篇文章有两个问题&#xff1a;01创建的容器不能操作和…

数据库课设(足球联赛管理系统)

一&#xff1a;前言 如果有关注博主的粉丝&#xff0c;可能会发现贴心杰又缺更好几天了&#xff0c;但是我是宠粉杰啊&#xff0c;怎么可能会忘了我的宝贝粉丝呢&#xff0c;只不过是临近期末&#xff0c;各种大作业课设如期而至&#xff0c;这几天我在写数据库课设&#xff0…

.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

前言笔者最近在开发和维护一个.NET Core 项目&#xff0c;其中使用几个非常有意思的.NET Core 相关的扩展&#xff0c;在此总结整理一下。EF Core 性能调优如果你的项目中使用了 EF Core, 且正在处于性能调优阶段&#xff0c;那么了解 EF Core 生成的 SQL 语句是非常关键的。那…

695.岛屿的最大面积(026)BFS

二:思路 1.这里的遍历数据方式为BFS广度遍历 2.当我们遇到一个‘1’的时候,我们就遍历他的左右上下&#xff08;邻接点&#xff09;&#xff0c;如果是1那就入队&#xff0c;直到队列 为空为止。 3.我们记录每个岛屿的面积是采用 我们设置初始值为1&#xff0c;当每遇到一个邻…

『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径

项目进度安排与跟踪一、项目进度安排的定义及原则1、进度安排的定义2、进度安排的基本原则二、通信开销1、通信开销的定义2、通信路径计算3、案例分析三、工作量分配1、40-20-40规则2、工作量分配图例3、工作量分布推荐四、项目进度安排方法1、关键路径方法(CPM,Critical Path …