实验07:子集和问题

news2024/11/19 1:22:06

1.实验目的

深刻理解回溯法的基本思想,掌握回溯法解决问题的一般步骤,学会使用回溯法解决实际问题.运用所熟悉的编程工具,借助回溯法的思想求解子集和数的问题。

2.实验内容

给定 n n n 个正整数 { x 1 , x 2 , ⋯   , x n } \{x_1, x_2, \cdots, x_n\} {x1,x2,,xn},以及一个整数 m m m,判定是否可以从 n n n 个数中取出若干个数,使它们的和等于 m m m。输出: Y E S YES YES或者 N O NO NO

3.实验要求

编制程序并对其时间复杂度和空间复杂度进行分析。

□ \square 基础性实验 □ \square 综合性实验 ⊠ \boxtimes 设计性实验


实验报告正文

一、问题分析(模型、算法设计和正确性证明等)

对每个整数有取或不取两种选择,判断是否存在一种选取方案是的所选元素之和为给定值 m m m

方法一:回溯法

在此借用课件中的完全二叉树作为问题规模 n = 3 n=3 n=3的解空间示例,由图可知,回溯的方法可以遍历所有子集判断是否存在一个子集使得其元素和为 m m m

约束条件: ∑ a ∈ S a = m \sum_{a\in S}{a}=m aSa=m,其中 S S S为原集合的子集

剪枝:

  1. 当前和加剩余元素最小值大于 m m m
  2. 当前和加剩余元素之和小于 m m m

方法二:动态规划

类似01背包问题,令 f [ i ] [ j ] f[i][j] f[i][j]表示前 i i i个数能否取出和为 j j j的子集,则有转移方程:
f [ 0 ] [ 0 ] = 1 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − a [ i ] ] ) f[0][0] = 1\\ f[i][j] = max(f[i-1][j], f[i][j-a[i]]) f[0][0]=1f[i][j]=max(f[i1][j],f[i][ja[i]])
可化简为:
f [ 0 ] = 0 f [ j ] = m a x ( f [ j ] , f [ j − a [ i ] ] ) f[0]=0\\ f[j] = max(f[j], f[j-a[i]]) f[0]=0f[j]=max(f[j],f[ja[i]])

二、算法设计复杂度分析(伪代码,不要粘贴源码)

回溯法伪代码:

在这里插入图片描述

回溯法复杂度: T ( n ) ∈ O ( 2 n ) T(n) \in O (2^n) T(n)O(2n)

动态规划伪代码:

在这里插入图片描述

动态规划复杂度: T ( n ) ∈ θ ( n m ) T(n) \in \theta (nm) T(n)θ(nm)

三、实验结果记录和分析(测试向量上的测试结果、运行时间)

回溯法运行时间:

动态规划运行时间:

在这里插入图片描述

显然动态规划算法在运行时间上的波动程度小于回溯法,且相同规模下运行时间远远小于回溯法。可见回溯法在问题规模较小的情况下有程序编写便捷性和准确性,但是只是在枚举的基础上对一些情况做出特殊处理来降低复杂度,本质上不改变算法复杂度。且回溯法对算法的优化依赖于输入数据,上图中可以看到问题规模相似的情况下运行时间差别仍然较大。

四、总结(可描述出现的问题和解决方法、经验和反思等)

剪枝的方法一定程度上消减了回溯法递归的时间复杂度,但是仍无法影响最坏情况。源程序见CODE文件夹,包括两种算法程序DfsAndDp.cpp,及随机输入数据生成程序generateData.cpp等。

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

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

相关文章

springboot 接口防刷(根据IP与路径限制)

接口防刷 一、全局接口防刷(通过拦截器方式)1、原理 代码示例 二、个别接口防刷(接口注解方式)1、代码示例 一、全局接口防刷(通过拦截器方式) 1、原理 代码示例 通过ip地址uri拼接用以作为访问者访问接口区分通过…

NX状态检测

输入 sudo -H pip install jetson-stats 如果提示没有pip,那么就输入 sudo apt-get install python-pip 之后输入 sudo jtop进行监测 用这个方法可以看到当前Jetpack的版本

记录 Vite 报错 process is not defined 报错问题

由于导入别人开发好的插件,在开发的时候报了process is not defined的错误,记录一下解决方式,方便后续使用。 1.查看里面具体的报错信息是找不到process这个问题。 原因: process.env 已经被遗弃(我个人查询百度&…

lwip - 链路层收发以太网数据帧

1、以太网帧结构 数据包在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据包称为数据帧,数据帧的封装的信息决定了数据如何传输。   以太网中传输的帧有两种格式,IEEE 802.3 和 Ethernet II,选择哪种格式由TCP/IP协议簇中的…

光伏太阳能直流浪涌保护器应用方案

由于用于光伏装置的直流电涌保护设备必须设计为完全暴露在阳光下,因此它们极易受到雷电的影响。光伏阵列的容量与其暴露的表面积直接相关,因此闪电事件的潜在影响随着系统规模的增加而增加。在照明频繁发生的情况下,未受保护的光伏系统可能会…

pytorch中BatchNorm2d的实验验证

BatchNorm2d 对二维矩阵进行批量归一化,mean为当前batch的均值,std为当前batch的标准差,使用批量归一化能够将取值范围不同的数据映射到标准正态分布的区间中,减少数据之间的差距,方便模型快速收敛。批量归一化本质上…

Vivado增量编译:加速FPGA设计实现的利器

随着FPGA设计的复杂度不断提高,设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中,Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。 通过阅读本文可以了解&#xff1…

大多数开发人员都不知道的JSON.stringify 秘密

作为前端开发工程师,你一定用过JSON.stringify,但你知道它的全部秘密吗? 基本上,JSON.stringify 将对象转换为 JSON 字符串。同时,JSON.stringify 有如下规则: JSON.stringify({name: Tom, age: 18}) {&q…

银行数字化转型导师坚鹏:数字人民币创新及金融场景应用

数字人民币创新及金融场景应用 课程背景: 很多银行存在以下问题: 不清楚数字人民币的发展历程? 不清楚数字人民币对我们有什么影响? 不知道数字人民币具体应用场景? 课程特色: 前沿性&#xff1a…

【c语言】带你快速理解函数的传值和传址

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

大数据 | 实验一:大数据系统基本实验 | 熟悉常用的HBase操作

文章目录 &#x1f4da;HBase安装&#x1f407;安装HBase&#x1f407;伪分布式模式配置&#x1f407;测试运行HBase&#x1f407;HBase java API编程环境配置 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;HBase Shell 编程命令实现以下指定…

【天梯赛补题】

175对我这种蒟蒻好难&#xff0c;&#xff0c;&#xff0c; L1-6剪切粘贴 题目详情 - L1-094 剪切粘贴 (pintia.cn) 天梯赛&#xff1a;L1-094 剪切粘贴_scarecrow133的博客-CSDN博客 本蒟蒻看到字符串就害怕&#xff0c;一看就没思路&#xff0c;果断跳过了…… 等佬佬讲…

表的查询内容

表的查询 这里是关键的select的使用对表不同的条件进行筛选&#xff0c;实现对于内容的书写 全列查询 使用*进行查询&#xff0c;表现的是整个表的内容。 指定列查询 name的id列信息查询 查询字段为表达式 这里的id加上10&#xff0c;形成了新的列表 这里的id1 id的结果聚合在…

echarts 象形柱图

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、象形柱图二、环形图…

苹果笔到底有没有必要买?苹果平板电容笔排行榜

事实上&#xff0c;Apple Pencil与市场上普遍存在的电容笔最大的区别&#xff0c;就是两者的重量以及所具有的压感都互不相同。但是&#xff0c;苹果原有的电容笔因其昂贵的价格而逐步被平替电容笔所替代&#xff0c;而平替电容笔所具备的各种性能也在逐步提高。接下来&#xf…

【c语言】函数的数据传递原理 | 数组传入函数方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

什么是摄像头组播技术?有哪些应用场景?

摄像头组播技术是一种广泛应用于视频会议、网络监控等领域的网络传输技术&#xff0c;它将摄像头采集到的视频信号通过网络进行传输&#xff0c;实现多用户同时观看。本文将介绍摄像头组播的基本原理、应用场景以及存在的问题与解决方案。 一、摄像头组播的基本原理 摄像头组播…

法规标准-EU 2021-646标准解读

EU 2021-646是做什么的&#xff1f; EU 2021-646全称为关于机动车紧急车道保持系统&#xff08;ELKS&#xff09;型式认证统一程序和技术规范&#xff0c;其中主要描述了对认证ELKS系统所需的功能要求及性能要求 基本要求 1.应急车道保持系统&#xff08;ELKS&#xff09;应…

obsidian体验组件世界

title: 组件世界-初体验 date: 2023-04-23 13:23 tags: &#x1f308;Description&#xff1a; ​ 逛网站的时候看到的组件库&#xff0c;感觉很漂亮&#xff0c;记录并实验看下效果。 我用的是 obsidian&#xff0c;所以本文是基于 obsidian 来实验组件世界的效果。 组件世界-…

iMazing2023最新免费版iOS设备管理软件

iMazing是一款功能强大的iOS设备管理软件&#xff0c;它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外&#xff0c;它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性&#xff0c;并教…