代码随想录算法训练营day43

题目:1049. 最后一块石头的重量 II 、494. 目标和、474.一和零

参考链接:代码随想录

1049. 最后一块石头的重量 II

思路:本题石头是相互粉碎,粉碎后剩下的重量就是两块石头之差,我们可以想到,把石头分成两堆总重量分别为A和B,则这两堆相互粉碎后,剩下的就是这两堆的重量之差,我们需要使得这个差尽可能小,即把石头尽可能分为两部分,使得他们重量差最小。然后和01背包问题对应起来,物品的重量就是石头的重量stones[i],物品的价值也是石头的重量stones[i],背包的容量最大为重量和除以2,因为这样使背包尽可能装满,二者的差就会最小。dp五部曲:dp数组,dp[j]表示容量为j的背包能装的最大重量;递推公式,和之前一样,当i能装进去的时候,dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);dp初始化,首先全部初始化为0,和上题一样;遍历顺序,对物品从0-i遍历,但对背包容量需要从大到小遍历;举例略。时间复杂度O(mn),m为总重量。

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum=accumulate(stones.begin(),stones.end(),0);int target=sum/2;vector<int> dp(target+1,0);//初始化dp数组for(int i=0;i<stones.size();i++){for(int j=target;j>=0;j--){if(stones[i]<=j){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}}return sum-dp[target]*2;}
};

关键在于如何把本题和01背包问题联系起来。

494. 目标和

思路:本题初看就是回溯法的组合总和,但是会超时。然后想想dp的方法,所有数前面只有+和-两种情况,我们设+的总和为x,则-的总和为sum-x,最后得到x-(sum-x)=2x-sum=target,故x=(sum+target)/2,我们把x当做背包容量,然后把x装满即可,需要求的是把容量为x的背包装满用的方法数量,其中weight和value都为nums。对x的计算,考虑取整问题,由于2x=sum+target,故sum和target必须奇偶性相同,如果不同则无解,直接排除,还有target的绝对值不可能大于sum,不然也无解,这两种情况都需要先排除。然后是方案的计算方法,本题也是一个元素只能放一次,故也是01背包问题,但是求解的东西不一样,01背包求的是最大价值,这里求的是方法数,故我们的dp数组需要有变化。五部曲:dp数组,dp[j]表示容量为j的背包装满的最大方法数;递推公式,还是和之前的方法思考,如果物品i不能最先放进去,那么就没有新的方法产生,方法数还是原来的dp[j],如果物品i可以先放进去,那么方法就需要在原有的基础上增加dp[j-nums[i]],故dp[j]+=dp[j-nums[i]];dp初始化,首先如果全部初始化为0,则递归后全部都是0,明显不符合,对于dp[0],不能初始化为0
只能初始化为1,即背包完全不放,也是一种方法,对其他dp[j],递推公式都是从dp[0]慢慢累加起来的,我们初始化为1;遍历顺序,和之前相同;举例,这种不好想的题目,还是得举例的,nums=[1,1,1,1,1],target=3,x=4,dp初始化为[1,0,0,0,0],当i=0时,dp由递推公式计算的[1,1,0,0,0],i=1时,[1,2,1,0,0],i=2时,[1,3,3,1,0],i=3时,[1,4,6,4,1],i=4时,[1,5,10,10,5],最终答案为5,符合。时间复杂度O(mn)。

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=accumulate(nums.begin(),nums.end(),0);if((sum+target)%2==1||abs(target)>sum){return 0;}int x=(sum+target)/2;vector<int> dp(x+1,0);dp[0]=1;for(int i=0;i<nums.size();i++){for(int j=x;j>=0;j--){if(nums[i]<=j){dp[j]+=dp[j-nums[i]];}}}return dp[x];}
};

本题的几个重点,首先是根据每个元素放一次想到01背包问题,然后是将正负分开计算得出背包容量,这里类似上题的一分为二,只考虑一部分就是背包容量,最后是dp数组的定义,需要根据题目所求灵活设置。
本题的递推公式dp[j]+=dp[j-nums[i]]常用于求背包中方法数。

474.一和零

思路:本题初看一点想法都没有,只想到纯暴力方法,把所有子集列出来,再计算0和1的个数。直接看解答,首先要弄明白几种背包问题的区别。
在这里插入图片描述
strs里数组的元素就是物品,每个物品只有一个,m和n相当于一个背包,只不过这个背包有两个维度,即两个维度都不能超过容量,物品的weight也有两个维度,分别是0和1的数量,value可以全部认为是1,因为要求集合元素数最大。这里如果按照最初始的01背包问题,需要三维数组,这里我们还是压缩一维,使用二维数组。五部曲:dp数组,dp[i][j]表示背包中最多物品的数量,其中0的个数不超过i,1的个数不超过j;递推公式,设物品k中0和1的数量分别为zeroNum和oneNum,则如果物品k能先放进去背包时,dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);初始化,对dp[0][0],物品数量为0,我们可以就全部初始化为0,这个和普通的01背包是一个意思;遍历顺序,从背包容量大到小遍历;举例略。时间复杂度O(kmn),k为strs长度。

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));//初始化全为0for(int k=0;k<strs.size();k++){int zeroNum=0,oneNum=0;for(char c:strs[k]){if(c=='0'){zeroNum++;}if(c=='1'){oneNum++;}}for(int i=m;i>=0;i--){for(int j=n;j>=0;j--){if(zeroNum<=i&&oneNum<=j){dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);}}}}return dp[m][n];}
};

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

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

相关文章

使用智谱 GLM-4-9B 和 SiliconCloud 云服务快速构建一个编码类智能体应用

本篇文章我将介绍使用智谱 AI 最新开源的 GLM-4-9B 模型和 GenAI 云服务 SiliconCloud 快速构建一个 RAG 应用&#xff0c;首先我会详细介绍下 GLM-4-9B 模型的能力情况和开源限制&#xff0c;以及 SiliconCloud 的使用介绍&#xff0c;最后构建一个编码类智能体应用作为测试。…

数据结构和算法之数组和链表

一、数组 数组是一种线性数据结构&#xff0c;它是由一组连续的内存单元组成的&#xff0c;用于存储相同类型的数据。在JavaScript中&#xff0c;数组可以包含任意类型的数据&#xff0c;不只限于基本数据类型。 1.存储方式 在内存中&#xff0c;数组的元素是连续存储的&…

【Vue】组件的存放目录问题

注意&#xff1a; .vue文件 本质无区别 组件分类 .vue文件分为2类&#xff0c;都是 .vue文件&#xff08;本质无区别&#xff09; 页面组件 &#xff08;配置路由规则时使用的组件&#xff09;复用组件&#xff08;多个组件中都使用到的组件&#xff09; 存放目录 分类开来的…

Llama模型家族之拒绝抽样(Rejection Sampling)(二)均匀分布简介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

ssti模板注入

一、Flask应用 1、介绍 定义 Flask&#xff1a;是一个使用Python编写的轻量级web应用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特点 良好的文档、丰富的插件、包含开发服务器和调试器、集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode。 …

手机短信删除怎么恢复?快速找回的3个秘密武器

手机&#xff0c;这个我们每天离不开的小玩意儿&#xff0c;有时候也会让我们头疼不已。比如&#xff0c;你一不小心&#xff0c;或者为了清理点空间&#xff0c;就把那些重要的短信给删了。这些短信可能是你和好友的深夜聊天&#xff0c;或者是重要的工作信息。一旦删除&#…

哪款开放式耳机佩戴最舒服?2024五款备受推崇产品分享!

​在现今耳机市场&#xff0c;开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计&#xff0c;备受消费者追捧。它们不仅让你在享受音乐时&#xff0c;仍能察觉周围的声音&#xff0c;确保与人交流无障碍&#xff0c;而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

GIGE 协议摘录 —— 引导寄存器(四)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

基于简单Agent对医疗数据进行分析

数据表 供应商资格审核规定.pdf 医生名录.xlsx 历史就诊记录.xlsx 患者信息名录.xlsx 药品.xlsx 药品库存管理.xlsx 采购单位基本信息.xlsx Agent测试 模型基于ChatGPT-3.5 问题&#xff1a;帮我找出不达标的供应商 Agent分析过程 [Thought: 0] Key Concepts: - 不达标的供…

嵌入式Linux系统中RTC应用的操作详解

第一:RTC的作用以及时间简介 “RTC”的英文全称是Reul-Time Clock,翻译过来是实时时钟芯片.实时时钟芯片是日常生活中应用最为广泛的电子器件之一,它为人们或者电子系统提供精确的实时时间,实时时钟芯片通过引脚对外提供时间读写接口,通常内部带有电池,保证在外部系统关…

【Android】使用EventBus进行线程间通讯

EventBus 简介 EventBus&#xff1a;github EventBus是Android和Java的发布/订阅事件总线。 简化组件之间的通信 解耦事件发送者和接收者 在 Activities, Fragments, background threads中表现良好 避免复杂且容易出错的依赖关系和生命周期问题 Publisher使用post发出…

好书推荐-人工智能数学基础

本书以零基础讲解为宗旨&#xff0c;面向学习数据科学与人工智能的读者&#xff0c;通俗地讲解每一个知识点&#xff0c;旨在帮助读者快速打下数学基础。    全书分为 4 篇&#xff0c;共 17 章。其中第 1 篇为数学知识基础篇&#xff0c;主要讲述了高等数学基础、微积分、泰…

Open vSwitch 数据包处理流程

一、Open vSwitch 数据包转发模式 Open vSwitch 根据不同的模块使用&#xff0c;主要分为两种数据包的转发模式&#xff1a;Datapath 模式和 DPDK 模式&#xff0c;这两种模式的主要区别在于&#xff1a; Datapath 模式&#xff1a; 使用内核空间的网络栈进行数据包的转发性能相…

UML实现图-部署图

概述 部署图(Deployent Diagram)描述了运行软件的系统中硬件和软件的物理结构。部署图中通常包含两种元素:节点和关联关系&#xff0c;部署图中每个配置必须存在于某些节点上。部署图也可以包含包或子系统。 节点是在运行时代表计算机资源的物理元素。节点名称有两种:简单名和…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

Nginx03-动态资源和LNMP介绍与实验、自动索引模块、基础认证模块、状态模块

目录 写在前面Nginx03案例1 模拟视频下载网站自动索引autoindex基础认证auth_basic模块状态stub_status模块模块小结 案例2 动态网站&#xff08;部署php代码&#xff09;概述常见的动态网站的架构LNMP架构流程数据库Mariadb安装安全配置基本操作 PHP安装php修改配置文件 Nginx…

AI做的2024年高考数学试卷,答案对吗?

2024年高考数学考试已经结束&#xff0c;现在呈上数学真题及AI给出的解答。供各位看官欣赏。 总的来说&#xff0c;人工做题两小时&#xff0c;AI解答两分钟。 但是&#xff0c;AI做的答案是否正确&#xff0c;那就要各位看官来评判了&#xff01; 注&#xff1a;试卷来源于…

2024年5大制作AI电子手册工具推荐

AI电子手册作为一种结合了人工智能技术和传统电子手册功能的新型工具&#xff0c;逐渐成为了企业进行知识管理和信息传递的重要工具&#xff0c;为企业提高效率、优化用户体验。在本文中&#xff0c;LookLook同学将简单介绍一下什么是AI电子手册、对企业有什么好处&#xff0c;…

电源变压器的作用和性能

电源变压器的主要作用是改变输入电压的大小&#xff0c;通常用于降低电压或升高电压&#xff0c;以便适应不同设备的需求。它们还可以提供隔离&#xff0c;使得输出电路与输入电路之间电气隔离&#xff0c;从而提高安全性。性能方面&#xff0c;电源变压器需要具有高效率、低温…