代码随想录算法训练营Day38|1049. 最后一块石头的重量 II , 494. 目标和 , 474.一和零

好久不见,兄弟们,我终于把期末考试考完了,现在已经放暑假回家了,开始恶补算法了,那么废话不多说,来看今天的内容

1049. 最后一块石头的重量 II:代码随想录

这道题目的意思就是给你一个数组表示每个石头的重量,只要两个石头相撞,重量小的重量变为0,大的就要减去小的重量,为你撞到只剩最后一个石头的时候,他的最小的重量为多少,其实这题也是一样的,我们要尽可能的将所有的石头分成相同的重量的两堆,这样的话撞完之后,所剩下的重量就是最小的,所以这题首先就是先求出所有石头的重量的总和,然后定义一个target等于sum除以2,然后这个背包的容量就是target,我们要做的就是从这个数组中找到石头他们的重量加起来尽可能的等于target,下面直接来上动规五部曲

1.dp数组以及其下标的含义:

        dp[i]就是容量为i的背包所装的最大重量的物品,注意这里的价值就是物品的重量。

2.递推公式:

        dp[j] = max(dp[j],dp[j - nums[i]] + nums[i]);

3.dp数组初始化:

        当背包的容量为零时,所装的物品的最大价值为0,其余的都是由递推公式推导而来,由于要娶最大值,所以全部要初始化为0,一避免被覆盖

4.遍历顺序:

        由于这里我进行了状态压缩,使用的时滚动数组,所以外层循环遍历的时物品,内层循环遍历的时背包的容量,外层循环是从前往后,因为是由上一个状态推导而来,而遍历被背包的时候,你想想看,我这个当前遍历的值是由左上角和上方的值推导而来的,所以如果我也是从前往后遍历的话,那原来的值就会被覆盖,因为我这个是滚动数组,所以我这里就要从后往前遍历,为了避免值被覆盖

说完了这些,下面我们来看具体的代码的实现

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum=0;int n=stones.size();for(int i=0;i<n;i++) sum+=stones[i];int target=sum/2;vector<int> dp(1501,0);for(int i=0;i<n;i++){for(int j=target;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}return fabs(sum-2*dp[target]);}
};

注意在最后的时候,由于我这个/是向下取整的,所以我剩余的元素的和一定是大于等于这个dp[target] 的值的,所以我就直接返回他们两个的差值就可以了。来看下一题

494. 目标和:代码随想录

这道题目的意思就是给你一个整数数组nums还有一个数字target,他让你将一些数变成负数,然后让整个数组的元素的和等于target,问你有多少种方法,那么这样的一道题,我们怎么用背包问题来解决呢,这里我先假设一共有元素和为p的数是不加负号的,那也就是说有另外的sum-p的元素和是要加上负号的,那整个数组的元素和就是p-(sum-p)注意这里中间的代表的是加上负号的意思,实际上你也可以写成这样更方便理解,p + -(sum-p)=target,这样再转化一下就是2p=target+sum,也就是p=(target+sum)/2;这样我们是不是就将其转化为了一个背包问题了,就是从数组中取数,将容量为这么多的背包装满有多少种方法,明确了这一点,直接上动规五部曲

1.dp数组以及其下标的含义:

        dp[j] 表示的就是将容量为j的背包装满有多少种不同的方法

2.递推公式:

        这里我是要求一共有多少种方法,而不是像之前一样求最大的价值,所以这里我们来分析一下,你想想看,只要我们明确了nums[i],我们就可以确定有dp [ j - nums[i] ] 种方法,这里你可能有一点迷惑,我们再来看看dp数组的定义是什么,dp数组的定义是将背包容量为j的背包装满一共有多少种方法,那么这里我的j是此时背包的容量,那么nums[i]代表的就是当前元素的值,而j - nums[i]代表的就是装满这么多的背包一共有多少种方法,所以此时你懂了吗,但是这只是一种情况,因为外层循环的nums[i]是会不断地变化的,所以这里是要不断的累加的,故得出递推公式为:dp[j] += dp[j-nums[i]];

3.dp数组的初始化:

        这里你想想看当我的背包容量为0时,我的dp数组的值应该等于多少,有人觉得应该等于0,真的是等于0吗,这么说过去好像说得通,就是什么都不加就是0,但是我们初始化要看的是题目的意思,而不是自己想,假设nums={0} ,targe=0,这样dp数组的值还是0吗,很明显不是吧,所以我们的dp[0]应该要初始化为1

4.dp数组的遍历顺序:

        和前面的题目一样,外层循环从前往后,内层循环从后往前,因为值会被覆盖掉,因为这里进行了状态压缩,使用的是滚动数组

下面来看具体的代码的实现:

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;int n=nums.size();for(int i=0;i<n;i++) sum+=nums[i];sum+=target;if(sum<0 || sum%2!=0) return 0;vector<int> dp(10001,0);dp[0]=1;target=sum/2;//dp数组的含义:有dp[i]种方法装满容量为i的背包for(int i=0;i<n;i++){for(int j=target;j>=nums[i];j--){dp[j]+=dp[j-nums[i]];}}return dp[target];} 
};

注意这里如果一开始就不能整除的话,就可以直接返回0了,代表没有方法,这里再分享一下另一种做法

class Solution {
public:int dfs(int i, int c, vector<int>& nums){if(i<0){if(c==0) return 1;else return 0;}else if(c<nums[i]){return dfs(i-1,c, nums);}else {return dfs(i-1,c, nums)+dfs(i-1,c-nums[i], nums);}}int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int i=0;i<nums.size();i++){sum+=nums[i];}target+=sum;int n=nums.size();if(target<0 || target%2!=0) return 0;else{target/=2;return dfs(n-1,target, nums);}}
};

这里是利用dfs的方法递归调用的,我们就是只来看看dfs内部的部分,其他的都是差不多的,这里的i代表的就是数组的下标当i小于0时,代表已经没有物品可以选了,此时如果c也恰好为0,则代表找到了一种情况,就返回1,否则返回0,接着就是如果当前的元素都已经大于我的c了那肯定是不选,就直接让下标减一再返回并且这里c是不变的,因为没有选,如果不是的话,就是返回选与不选的和因为这里是求所有的情况,选或者是不选都有可能满足条件相加返回即可

接着在主函数中调用传入参数n-1,和target即可,这就是这道题目的解答

474.一和零: 代码随想录

这道题目的意思就是给你一个字符串数组nums,然后给你一个m和n分别表示子集中0和1的最大数量,让你找到一个子集,这个子集中最多有m个0和n个1,那么这样一个问题我们怎么用背包的思想来思考呢,其实这里只是将背包的容量提升到了两个维度,也就是1和0的数量,其他的都是不变的,明确了这一点我们直接来上动规五部曲

1.dp数组以及其下标的含义:

        这里注意我们虽然仍然是状态压缩,也就是用滚动数组,但是重点是我们这里重量是有两个维度的,也就是说明只用一个一维数组是不够的,所以这里我们要用一个二维数组来表示,i,j就是分别表示0的最大数量和1的最大数量,dp[i][j]就是代表一个子集的最大的长度,在1的个数最多为n和0的个数最多为m的情况之下

2.递推公式:

        这里对比以前的01背包,递推公式是一样的,只不过有两个维度需要考虑,这里的x,y分别表示当前遍历的字符串里的0个数和1的个数,也就是相当于之前的nums[i],所以递推公式就是dp[i][j]=max(dp[i][j] , dp[i - x][j - y] + 1) ,注意这里的价值就是子集的个数后面的加1代表选,选的话子集的个数必然要加1

3.dp数组初始化:

        这里当i,j为0时,必然都为0,所以全部初始化为0即可

4.遍历顺序:

        这里需要着重强调的是,即使我这里用的是二维数组,我任然是滚动数组,也就是最外层循环遍历的是数组里的字符串元素,内层遍历的是0和1两个维度,即使是两层循环在内部,任然是要从后往前遍历,因为如果是从前往后遍历会覆盖掉元素

来看具体的代码的实现:

class Solution {
public:int findMaxForm(vector<string>& nums, int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(string s:nums){int x=0;int y=0;for(char c:s){if(c=='0') x++;else y++;}for(int i=m;i>=x;i--){for(int j=n;j>=y;j--){dp[i][j]=max(dp[i][j],dp[i-x][j-y]+1);}}}return dp[m][n];}
};

最后返回dp[i][j]即可,以上就是今天的全部内容了,继续努力吧!

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

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

相关文章

【Python】已解决:FileNotFoundError: [Errno 2] No such file or directory: ‘D:\1. PDF’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;FileNotFoundError: [Errno 2] No such file or directory: ‘D:\1. PDF’ 一、分析问题背景 在Python编程中&#xff0c;当你尝试打开一个不存在的文件时&…

索引唯一约束问题SQL

新增报错违反唯一约束条件 (JING_DIAN.SYS_C0096533) 【问题原因】 这个问题可能是由于在Oracle APEX中&#xff0c;虽然你创建了一个名为"ISEQ_520227"的索引&#xff0c;但是在插入数据时&#xff0c;违反了唯一约束条件。这可能是因为你的数据表中已经存在相同的…

压测引擎数据库设计(上)

压测引擎数据库设计&#xff08;上&#xff09; 引言 在当今快速发展的互联网时代&#xff0c;软件质量保证和性能测试变得尤为重要。自动化测试平台&#xff0c;提供了一套完整的解决方案&#xff0c;以确保软件产品在发布前能够满足性能和稳定性的要求。本文将深入探讨滴云自…

jmeter-beanshell学习6-beanshell生成测试报告

前面写了各种准备工作&#xff0c;内容组合用起来&#xff0c;应该能做自动化了&#xff0c;最后一步&#xff0c;生成一个报告&#xff0c;报告格式还是csv 报告生成的路径和文件&#xff0c;在用户参数写好&#xff0c;防止以后改路径或者名字&#xff0c;要去代码里面改。以…

[AHK V2]AHK能取消正常窗口的双击标题栏最大化事件吗?

问题&#xff1a; AHK能取消正常窗口的双击标题栏最大化事件吗&#xff1f; 解答&#xff1a; AutoHotkey (AHK)是一个强大的脚本语言&#xff0c;可以用来自定义键盘快捷键、鼠标操作等。如果你想阻止双击Windows标题栏进行最大化操作&#xff0c;你可以编写一个脚本来拦截…

Django自动生成Swagger接口文档 —— Python

1. 前言 当接口开发完成&#xff0c;紧接着需要编写接口文档。传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写&#xff0c;但此类接口文档维护更新比较麻烦&#xff0c;每次接口有变更&#xff0c;需要手动修改接口文档。在实际的工作中&#xff0c;经常会遇…

tomcat的优化和tomcat和nginx实现动静分离:

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强。大项目不使用tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;python&#xff0c;rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用&#xff09;&#xff0c;动静分离。 优化tomcat的启动…

Python入门 2024/7/8

目录 数据容器 dict(字典&#xff0c;映射) 语法 定义字典字面量 定义字典变量 定义空字典 从字典中基于key获取value 字典的嵌套 字典的常用操作 新增元素 更新元素 删除元素 清空字典 获取全部的key 遍历字典 统计字典内的元素数量 练习 数据容器的通用操作…

linux环境下echo命令简单测试端口是否连通——筑梦之路

语法格式 echo > /dev/tcp/目标主机地址/端口号 示例 echo > /dev/tcp/example.com/80 当命令执行后&#xff0c;若端口是开放的&#xff0c;命令不会有任何输出并且会立即返回命令提示符&#xff1b;若端口未开放或连接失败&#xff0c;则可能由于网络问题、防火墙限…

在公司的业务杂记1之多选部门且主表没有部门字段(子表查询)

原型 1.新建&#xff0c;上传报告可多选部门 2.查询&#xff0c;可多选部门 数据库&#xff08;Postgresql&#xff09; 方式一 新增字段Jsonb&#xff1a; CREATE TABLE public.admin_report (admin_report_uuid uuid DEFAULT gen_random_uuid() NOT NULL,admin_report_tit…

java —— JSP 技术

一、JSP &#xff08;一&#xff09;前言 1、.jsp 与 .html 一样属于前端内容&#xff0c;创建在 WebContent 之下&#xff1b; 2、嵌套的 java 语句放置在<% %>里面&#xff1b; 3、嵌套 java 语句的三种语法&#xff1a; ① 脚本&#xff1a;<% java 代码 %>…

安全防御第三天(笔记持续更新)

1.接口类型以及作用 接口 --- 物理接口 三层口 --- 可以配置IP地址的接口 二层口 普通二层口 接口对 --- “透明网线” --- 可以将一个或者两个接口配置成为接口对&#xff0c;则 数据从一个接口进&#xff0c;将不需要查看MAC地址表&#xff0c;直接从另一个接口出&#xff1b…

机器学习模型运用在机器人上

机器学习模型在机器人技术中的应用非常广泛&#xff0c;涵盖了从简单的运动控制到复杂的认知和交互功能。以下是几种机器学习模型在机器人上的典型应用&#xff1a; 感知与识别&#xff1a; 计算机视觉&#xff1a;使用卷积神经网络&#xff08;CNNs&#xff09;识别和理解视觉…

汇川CodeSysPLC教程 Modbus变量编址

线圈&#xff1a;位变量&#xff0c;只有两种状态0和1。汇川PLC中包含Q区及SM区等变量。 寄存器&#xff1a;16位&#xff08;字&#xff09;变量&#xff0c;本PLC中包含M区及SD区等变量 说明&#xff1a; 汇川HMI的专用协议使用不同功能码&#xff1a;在访问SM时&#xff0c…

Python--并发编程--协程

概念 协程是轻量级的线程&#xff0c;它是程序员管理的并发机制&#xff0c;使得在一个线程中程序可以在多个函数之间交替运行。 Python中主要通过asyncio模块实现协程。 协程函数 用async修饰的函数 import asyncio# func为协程函数 async def func():await asyncio.slee…

Linux开发:进程间通过Unix Domain Socket传递文件描述符

Linux开发:进程间通过Unix Domain Socket传递数据-CSDN博客 介绍了通过UDS传递数据 实际上当需要传递大量的数据时,可以通过UDS直接传递文件描述符,这样接收文件描述符的一方,可以直接从传递过来的文件描述符读取数据 先举例说明: //uds_fd.hpp #pragma once #include &…

时尚品牌GOODBAI好人好事系列纪录片——Jupiter乐队的热血与梦想

时尚品牌GOODBAI推出的好人好事系列纪录片迎来了第二期&#xff0c;本期特别邀请了充满年轻活力的Jupiter乐队。纪录片通过真实的镜头&#xff0c;记录了他们在排练室中充满热血和灵感的创作过程&#xff0c;面对冷清观众席的微妙情绪&#xff0c;以及对未来的深刻思考和殷切期…

2024HW必修高危漏洞集合_v4.0

高危风险漏洞一直是企业网络安全防护的薄弱点&#xff0c;也成为HW攻防演练期间红队的重要突破口;每年 HW期间爆发了大量的高危风险漏洞成为红队突破网络边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、甚至靶标失守而遗憾出局。 HW 攻防演练在即&…

Vue的仓库是什么

Vue的仓库在广义上可以指存放Vue.js项目相关代码、组件、工具等资源的集合&#xff0c;这些资源可能托管在GitHub、GitLab等代码托管平台上。然而&#xff0c;在更具体的语境下&#xff0c;Vue的仓库可能指的是以下几个方面的内容&#xff1a; 1. Vue官方仓库 Vue.js核心库仓…

如何做一个透明度渐现且向上位移逐行出现的文字效果

前言 在这个夜黑风高的夜晚&#xff0c;你的眼睛已经开始有些疲惫。你的手指在键盘上轻轻地敲击着&#xff0c;仿佛在弹奏一首无声的夜曲。你的思绪在代码的海洋中飘荡&#xff0c;寻找着最后一行需要完成的代码。就在这时&#xff0c;你的老板走了过来&#xff0c;他的脸上带…