【蓝桥杯速成】| 7.01背包练习生
题目一:分割等和子集
问题描述
416. 分割等和子集 - 力扣(LeetCode)
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 2001 <= nums[i] <= 100
解题步骤
在昨天的01背包理论学习结束后,对于这个题目我们可以照葫芦画瓢地浅套一下
之前的题目物品有序号,价值,重量3个属性,本题就只有序号和数值两个属性,
为了便于理解其实我们可以将这个nums的值既视为这个数字的价值,也视为这个数字的重量
背包的容量就是我们要寻求的目标值
为了将数组分割成两个元素和相等的子集,
我一开始想的是:总和-当前值=之前值
这一看就涉及很多,何不再想简单一点,要能分成一半一半,
那目标target就定为一半不就好了,如果有刚好和是一半的,那剩下的肯定是另一半(有点绕但应该能理解)
那么很明显这里可以做个剪枝,如果数组之和为奇数,那必然找不到等分的!
if(sum% 2==1) return false;
ok,走流程!
这里选择更优的一维数组来实现
1.确定dp数组的定义
参考之前的题目,我们将dp[ j ]理解为背包容量为 j 时所取的和最大值
最后我们要求的就是dp[ target ]
如果dp[ target ]=target,就是用目标容量装下了目标价值的数,符合题意返回true
否则返回false
那么数组大小就可以设置为target+1;
vecto<int> dp(target+1);
2.确定递推公式
还是需要使用max函数,在滚动状态中选择最大值
dp[ j ]=max( dp[ j ] ,dp[ j -nums[i]]+nums[i])//前一个nums[i]表示这个数字占的位置,后一个表示这个数字的价值
3.初始化
没有什么需要特别初始化为具体值的,明确dp[ 0 ]=0(背包容量为0价值必为0)
其它值只要不影响取最大值即可,推荐统一初始化为0
4.遍历顺序
按照昨天的推理,我们用外层遍历数字,用内层倒序遍历背包容量,
这样可以在确保每个数字只使用一次的同时
可以顺利的利用之前的dp值推理出现在的dp值
for(int i=0;i<nums.size();i++){
for(int j=target;j<=nums[i];j--){
最后对结果做判断
if (dp[target]==target) return true;
完整代码如下👇
code
class Solution {
public:bool canPartition(vector<int>& nums) {int n=nums.size();if(accumulate(nums.begin(), nums.end(),0)%2==1) return false;//和为奇数是凑不出来滴!int target=accumulate(nums.begin(), nums.end(), 0)/2;vector<int> dp(target+1,0);//背包容量为这个数组所有值之和的一半,//设为总和你不还得减一下再比较,那你不如直接以一半为目标//i表示可选范围在前i个数字//dp[j]表示背包容量为j时的各种组合中的最大和(奔着一半去的嘛)for(int i=0;i<n;i++){for(int j=target;j>=nums[i];j--){dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);//nums的值既是价值也是质量} }if(dp[target]==target)return true;return false;}
};
题目二:最后一块石头的重量
问题描述
1049. 最后一块石头的重量 II - 力扣(LeetCode)
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
- 如果
x == y,那么两块石头都会被完全粉碎; - 如果
x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。
示例 1:
输入:stones = [2,7,4,1,8,1] 输出:1 解释: 组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1], 组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1], 组合 2 和 1,得到 1,所以数组转化为 [1,1,1], 组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
示例 2:
输入:stones = [31,26,33,21,40] 输出:5
解题步骤
一开始,看完题目我的想法就被困在了对对碰中,
一个劲地想怎么在最后取到min?怎么任选?
但是跳出仍选石头,进行碰撞,更新石头值这个循环
应该可以悟到,我们能把这个任务简化为两个大石头之间的较量
倘若两个大石头的值相等,那最后就是被消消乐完了,最小值为0
不相等也没关系,趋近相等就可以得出最小差值
这么一想,这个题目就和上面的分割等和子集一样了
就是目标判定的时候我们不需要它就和target相等
所以稍微修改一下代码逻辑就可以AC啦
开始先计算一下几个有关量
int size=stones.size();//遍历石头的边界
int sum=accumulate(stones.begin(),stones.end(),0);//石头总和
int target=sum/2;//尽可能取到的,理想化的目标
因为我们不再要求等分,所以对%2的判断也不再需要
再定义dp数组,同时全部初始化为0
vector<int> dp(target+1,0);
然后是循环体和递推公式,依旧是逆推,每次取最大值
for(int i=0;i<size;i++){
for(int j=target;j>=stones[i];j--){
dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
最后再明确一下目标,凑出最趋近于石头总和一半的结果,
一组石头的总和为dp[target],那另一组就是sum-dp[target]
最后两组差值就是sum-dp[target]*2
return sum-dp[target]*2;
code
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {//简化想法:不要被困在题目两两相撞的逻辑中//如果就两块石头,那么相撞结果肯定就是差值//那么我们何不把这么多块石头就分成两组,要是两组大小相等那最小重量肯定为0int size=stones.size();int sum=accumulate(stones.begin(),stones.end(),0);int target=sum/2;//尽可能取到vector<int> dp(target+1,0);for(int i=0;i<size;i++){for(int j=target;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}return sum-dp[target]*2;}
};
相关文章:
【蓝桥杯速成】| 7.01背包练习生
题目一:分割等和子集 问题描述 416. 分割等和子集 - 力扣(LeetCode) 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:…...
杰理科技JL703N双模蓝牙芯片—云信
杰理科技JL703N芯片运算能力、接收灵敏度、发射功率、音频性能等指标均处于行业一流水平,能满足多场景的应用需求,具有以下明显优势: 一、高性能双核浮点CPU,算力十足 JL703N芯片搭载了32位高性能双核CPU,主频高达32…...
Rust + 时序数据库 TDengine:打造高性能时序数据处理利器
引言:为什么选择 TDengine 与 Rust? TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库,支持高并发写入、高效查询及流式计算,通过“一个数据采集点一张表”与“超级表”的概念显著提升性能…...
Nvidia 官方CUDA课程学习笔记
之前心血来潮学习了一下Nvidia CUDA,外行,文章有理解不当的地方,望指正。 主要根据以下Nvidia官方课程学习: https://www.bilibili.com/video/BV1JJ4m1P7xW/?spm_id_from333.337.search-card.all.click&vd_sourcec256dbf86b…...
基于TCN-BiLSTM-Attention的序列数据预测(功率预测、故障诊断)模型及代码详解
TCN-BiLSTM-Attention结构 在TCN-BiLSTM-Attention结构中,各层之间的协同工作构成了一个强大的时间序列预测模型。这种组合不仅充分利用了每种模型的优势,还通过精心设计的连接方式最大化了模型的性能。 TCN-BiLSTM-Attention结构的主要组成部分包括: 时间卷积网络(TCN) 功…...
【AI News | 20250319】每日AI进展
AI Repos 1、XianyuAutoAgent 实现了 24 小时自动化值守的 AI 智能客服系统,支持多专家协同决策、智能议价和上下文感知对话,让我们店铺管理更轻松。主要功能: 智能对话引擎,支持上下文感知和专家路由阶梯降价策略,自…...
一种基于大规模语言模型LLM的数据分析洞察生成方法
从复杂数据库中提取洞察对数据驱动决策至关重要,但传统手动生成洞察的方式耗时耗力,现有自动化数据分析方法生成的洞察不如人工生成的有洞察力,且存在适用场景受限等问题。下文将介绍一种新的方法,通过生成高层次问题和子问题,并使用SQL查询和LLM总结生成多表数据库中的见…...
怎么用LoRA的低秩结构近似Fisher矩阵
怎么用LoRA的低秩结构近似Fisher矩阵 目录 怎么用LoRA的低秩结构近似Fisher矩阵**1. Fisher矩阵的内存挑战****2. LoRA的低秩结构与Fisher近似****3. 具体实现步骤****4. 示例说明****5. 有效性分析****6. 扩展与优化****总结**在LoRA(低秩适应)中,通过低秩结构近似Fisher矩…...
docker(1) -- centos镜像
1. 前言 我在WSL中运行的系统是ubuntu2024,并安装了docker,想要在docker中运行一个centos的系统。 2. 下载并运行镜像 # 下载centos最新版镜像 $ docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: P…...
【npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree】
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree 当我们拿到一个前端项目的时候,想要把它运行起来,首先是要给它安装依赖,即cd到…...
用 pytorch 从零开始创建大语言模型(四):从零开始实现一个用于生成文本的GPT模型
从零开始创建大语言模型(Python/pytorch )(四):从零开始实现一个用于生成文本的GPT模型 4 从零开始实现一个用于生成文本的GPT模型4.1 编写 L L M LLM LLM架构4.2 使用层归一化对激活值进行标准化4.3 使用GELU激活函数…...
【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】
新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍 在新能源汽车蓬勃发展的浪潮中,三电系统(电池、电机、电控)无疑是其核心驱动力。而恒压源与恒流源,作为电源管理的关键要素,在…...
目标检测20年(一)
今天看的文献是《Object Detection in 20 Years: A Survey》,非常经典的一篇目标检测文献,希望通过这篇文章学习到目标检测的基础方法并提供一些创新思想。 论文链接:1905.05055 一、摘要 1.1 原文 Object detection, as of one the most…...
Scikit-learn 学习思维导图
Scikit-learn 学习思维导图 #mermaid-svg-LoibxEyLRA2fItOn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LoibxEyLRA2fItOn .error-icon{fill:#552222;}#mermaid-svg-LoibxEyLRA2fItOn .error-text{fill:#552222;…...
【MySQL数据库】存储过程与自定义函数(含: SQL变量、分支语句、循环语句 和 游标、异常处理 等内容)
存储过程:一组预编译的SQL语句和流程控制语句,被命名并存储在数据库中。存储过程可以用来封装复杂的数据库操作逻辑,并在需要时进行调用。 类似的操作还有:自定义函数、.sql文件导入。 我们先从熟悉的函数开始说起: …...
WEB攻防-PHP反序列化-字符串逃逸
目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时,语法是以 ; 作为字段的分隔,以 } 作为结尾,在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…...
英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析
【完整版】3月19日,黄仁勋Nvidia GTC 2025 主题演讲|英伟达 英伟达GTC 2025大会产品全景剖析与未来路线深度洞察分析 一、引言 1.1 分析内容 本研究主要采用了文献研究法、数据分析以及专家观点引用相结合的方法。在文献研究方面,广泛收集了…...
基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)
系统功能 管理员功能模块: 个人中心 用户管理 日记信息管理 美食信息管理 景点信息管理 新闻推荐管理 日志展示管理 论坛管理 我的收藏管理 管理员管理 留言板管理 系统管理 用户功能模块: 个人中心 日记信息管理 美食信息管理 景点信息…...
【Java】Mybatis学习笔记
目录 一.搭建Mybatis 二.Mybatis核心配置文件解析 1.environment标签 2.typeAliases 3.mappers 三.Mybatis获取参数值 四.Mybatis查询功能 五.特殊的SQL执行 1.模糊查询 2.批量删除 3.动态设置表名 4.添加功能获取自增的主键 六.自定义映射ResultMap 1.配置文件处…...
从DNA到AI:一部35亿年的智能进化史诗
从DNA到AI:一部35亿年的智能进化史诗 一、生命起源:宇宙熵增中的第一缕秩序之光 在35亿年前的地球原始海洋中,DNA的诞生标志着一场伟大的反叛:混沌汤中浮现出能自我复制的有序结构。这种由4种碱基组成的分子,用其双螺…...
遗传算法+四模型+双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测
遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 遗传算法四模型双向网络!GA-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于GA-CNN-BiLSTM-Attention、CNN-BiL…...
中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵
中兴电信B860AV3.2-T/B860AV3.1-T2_晶晨S905L3-B芯片_28G_安卓9.0_先线刷后卡刷-刷机固件包,完美修复刷机后盒子反复重启的瑕疵。 这两款盒子是可以通刷的,最早这个固件之前论坛本人以及其他水友都有分享交流过不少的固件,大概都…...
Elasticsearch基础教程:从入门到上手
🎯 一、Elasticsearch简介 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索引擎,支持全文检索、结构化查询、分析和近实时搜索。常用于日志分析、商品搜索、数据分析等场景。 1. 什么是 Elasticsearch? Elas…...
RxSwift 学习笔记第四篇之RxSwift在项目中的简单应用
目录 前言 一、RxCocoa在项目中的用法 1.Target Action 2.代理 3.闭包回调 4.通知 二、一个计时器的例子 前言 在上面的两篇文章中,我们了解到了RxSwift中的Observable和Observer,本篇文章我们主要介绍下RxSwift项目中的使用。 一、RxCocoa在项目中的用法 RxCocoa 给 …...
《Python实战进阶》No27: 日志管理:Logging 模块的最佳实践(下)
No27: 日志管理:Logging 模块的最佳实践(下) 实战案例 :复杂场景下的 Logging 配置与使用 本实战案例在 Python 3.11.5环境下运行通过 在本案例中,我们将通过一个复杂的日志配置示例,全面展示 logging 模…...
Web 小项目: 网页版图书管理系统
目录 最终效果展示 代码 Gitee 地址 1. 引言 2. 留言板 [热身小练习] 2.1 准备工作 - 配置相关 2.2 创建留言表 2.3 创建 Java 类 2.4 定义 Mapper 接口 2.5 controller 2.6 service 3. 图书管理系统 3.1 准备工作 - 配置相关 3.2 创建数据库表 3.2.1 创建用户表…...
【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
目录 1 引言2 项目简介3 快速上手3.1 下载代码3.2 环境配置3.3 项目结构3.4 下载模型与数据集3.5 运行指令3.6 核心参数说明3.6.1 通用参数3.6.2 优化器/学习率3.6.3 数据相关 4 结语 1 引言 在人工智能和机器学习领域,生成模型的应用越来越广泛。Stable Diffusion…...
《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》
目录 绕过火绒终端安全软件的详细方法 方法一:利用系统程序副本绕过命令监控 方法二:结合certutil.exe副本下载并执行上线木马 注意事项 总结 实际案例解决方案 前提条件 详细操作步骤 1. 攻击主机(VPS)上的准备工作 2.…...
上海高考解析几何
解析几何的核心思想。 1. 核心分析方法: 自由度引入 方程组中, n n n 个未知数需要 n n n 个等式来解出具体的值。 自由度 性质 一个未知数带来一个自由度,一个等式条件减少一个自由度(减少自由度的方式为消元)。…...
android MutableLiveData setValue 响应速速 postValue 快
MutableLiveData 是 LiveData 的一个可变版本,常用于在ViewModel中保存和管理UI相关的数据。MutableLiveData 提供了两种主要的方法来更新其值:setValue 和 postValue。关于这两者的响应速度,通常认为 setValue 比 postValue 更快。下面详细解释这两者的区别以及影响响应速度…...
