代码随想录算法训练营Day37 |01背包登场,416. 分割等和子集

今天学习了一个新的内容——01背包,应用场景是这样的,你有一个背包最多能装重量为maxweight重量的物品,你有n个物品,他们的价值分别为value[i],重量分别为weight[i],其中i为物品的下标,每件物品只能用一次,你需要保证在不超过背包所能承受的最大重量的情况下,背包内所装的最大价值是多少?这就是大名鼎鼎的01背包,那么对于这样一个问题,我们该如何思考呢,首先,还是老规矩,直接上动规五部曲

01背包问题 二维:

1.dp数组的定义和下标的含义

dp[i][j] 代表的意思就是在前 i 个物品里选择若干个物品,放在容量为j的背包里所代表的最大价值为多少,这就是dp数组的含义

2.dp数组的递推公式

我们知道对于当前的位置,你只有两种选择,那就是将物品放进背包,或者是不放进背包,那这里就有一个前提了,那就是此时的背包的容量与你的物品的重量的关系,如果说,你物品的重量大于我此时背包的容量,就说明一定是不放进去的,那就说明此时不需要做状态转移,拿这里的dp[ i ][ j ]应该等于多少呢,我们一定要明确dp数组的定义,此时背包的容量就是j,所以j是不动的,但是现在这个物品是不放进去的,所以我对应的i是不是应该减一啊,所以此时的状态转移方程应该就是dp[ i ][ j ] = dp[ i -1 ][ j ],那么另一种情况,如果说不大于背包的容量,这个物品是可以放进去的,那么我们是不是就是在放进去的价值和不放进去的价值中取一个最大值啊,所以放进去的转移方程应该怎么写呢,还是dp数组的含义,如果我放进去了,那么是不是此时我背包的容量就仅剩j - weight[ i ] 了,那这是不是就是在前i-1个物品里选择若干个物品放在j - weight[ i ]容量的背包里所代表的最大价值加上此时放入的value[ i ]啊,所以状态转移方程如下: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3.dp数组的初始化

这里的初始化就很有讲究了,首先,就是要明确一点,我们这个dp数组的当前值是不是都是由左上和上方的值转移过来的啊,所以,我们最左边和最上面的值是必须要初始化的,首先来看最左边,当背包的容量为0时,是不是装不进任何的物品,所以全部初始化为0,当放入的物品数量为1时,我们就要看他的物品的重量是不是大于背包的容量,如果大于背包的容量,就是可以放进去的,不是的话,就是0,其他的由于都是在后面遍历的过程中会被覆盖,所以只要初始化为0就可以了

4。dp数组的遍历顺序,这里的遍历顺序是没有要求的,因为你无论是先遍历物品还是背包,你的左上部分和你的上面始终都是存在数值的,或者说是已经初始化好了,或者是已经遍历过了,所以这里是不做要求的

那么以上就是01背包二维dp数组的理论部分

01背包问题 一维:

一维呢实际上就是一个滚动数组,在二维的基础上做了一个状态压缩,实际上就是将i的那一层给压缩了,这里你就需要注意一点了,首先就是递推公式的变化,递推公式应该就是这样了,因为在二维我们知道,如果说不放入物品的话,就是直接是上面一层的状态直接复制下来,用代码表示就是这样——dp[ i ][ j ] = dp[ i -1 ][ j ],但是现在我们去除了i这一层,所以就直接写成dp[ j ] = dp[j]就可以了,如果放进去就是——dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 还有就是初始化的操作,这里还是要再次明确dp数组的含义,和上面差不多,dp[0] = 0,其他的都是在后面遍历的时候会赋值的,所以也初始化为0就可以了,至于遍历顺序,遍历背包的顺序是不一样的,因为如果还是从前往后遍历,会把初始值给覆盖掉,所以这里要从后往前遍历,值得注意的是在内层循环遍历背包的时候,你的循环的终止条件就是大于等于我的weight[i]了,因为你要看我的递推公式有个j - weight[i] ,这样才能避免下标越界,并且小于的话也没有意义。

416. 分割等和子集:代码随想录

这道题目最重要的点是你必须要会一个转换,就是你需要在数组中找到若干个元素的和为sum的一半,这一点是非常重要的,这样你就可以将其转化为一个01背包问题,因为题目中说让你判断将这个nums数组分成两个子集,他们的和能不能相等来一个简单的数学证明,假设我选的元素的和为p,那么剩余的元素的和为为sum - p,这里的sum代表所有的元素的和,然后就是2p = sum,p = sum / 2,这样就转化为了一个01背包问题,当然,如果说sum%2!=0的话,那么我们直接返回false就可以了,然后就是dp数组以及其下标的含义,这里你还需要注意的一点就是他这里的weight数组和value数组都是nums数组,所以我们只需要在遍历完后看dp[target]是不是等于target即可,如果等于的话,就代表背包已经装满了,那么此时我直接返回true即可,相反如果不等于的话就直接返回false,这里dp数组的含义就是在背包容量为j的情况下我背包的价值是多少,递推公式只要做一点小小的改动,就是将weight数组和value数组全部改成nums数组就可以了,下面来看具体代码的实现:

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum=0;int n=nums.size();
        for(int i=0;i<n;i++) sum+=nums[i];
        if(sum%2!=0) return false;
        else {
            int target=sum/2;
            vector<int> dp(10002,0);
            for(int i=0;i<nums.size();i++){
                for(int j=target;j>=nums[i];j--){
                    dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
                }
            }
            return dp[target]==target;
        }
    }
};

首先就是初始化,这里是全部初始化为0,然后就是遍历顺序,和上面的一维dp数组一样,就是内层循环从后往前遍历,直到j小于nums[i]的时候为止,最后返回是否相等即可,这题我也是没有写出来,思路我都想明白了,但是就是不知道代码应该怎么写,可能是今天刚刚接触这个新的知识吧,我现在觉得我已经差不多清楚01背包的大致过程了,但是一些细节上的点,还是不是很明白

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# SocketUDP服务器,组播

SocketUDP 自己即是服务器又是客户端 &#xff0c;在发消息只需要改成对方ip和端口号即可 前提对方必须开启服务器 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.72"), 8080)); 控件&#xff1a;Button,TextBox,RichTextBox 打开自己服务器 public…

六、资产安全—信息分级资产管理与隐私保护(CISSP)

目录 1.信息分级 2.信息分级方法 3.责任的层级 4.资产管理 5.隐私数据管理角色 6.数据安全控制 7.数据保护方案 8.使用安全基线 六、资产安全—数据管理(CISSP): 五、身份与访问管理—身份管理和访问控制管理(CISSP): 1.信息分级 信息分级举列: 2.信息分级方…

Halcon 文本文件操作,形态学

一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…

记录一下MATLAB优化器出现的问题和解决

今天MATLAB优化器出了点问题。我想了想&#xff0c;决定解决一下&#xff0c;不然后面项目没有办法进行下去。 我忘了截图了。 具体来说&#xff0c;是出现了下面的问题。 Gurobi: Cplex: 在上次为了强化学习调整了Pytoch环境以后&#xff08;不知道是不是这个原因&#…

Mac(M1芯片)安装多个jdk,Mac卸载jdk

1.jdk下载 oracle官方链接&#xff1a;oracle官方下载链接 2.安装 直接下一步&#xff0c;下一步就行 3.查看是否安装成功 出现下图内容表示安装成功。 4.配置环境变量 open -e .bash_profile 路径建议复制过去 #刷新环境变量 source ~/.bash_profile 5.切换方法 6.jdk…

页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页&#xff0c;我们说到了 InnoDB 的索引是以 B树的形式构建的&#xff0c;而且 B树的节点都是一个数据页。 但是 B树在使用过程中难免会有节点分裂和节点合并的过程。 因为我们是以数据页为基本单位构造的 B树&#xff0c;那么 B树的节点分裂和…

火锅食材配送小程序的作用有什么

火锅店、麻辣烫店、餐厅等对火锅丸子食材的需求量很高&#xff0c;还有普通消费者零售等&#xff0c;市场中或城市里总是有着较为知名的食材店或厂商&#xff0c;通过产品质量、口碑、宣传、老客复购等获得更多生意营收。 线下生意放缓&#xff0c;需要商家拓宽渠道。运用雨科…

7thonline第七在线受邀出席零售业卓越运营联盟(COER)2024

近期&#xff0c;一场汇集行业精英、探讨卓越运营的盛会——零售业卓越运营联盟&#xff08;COER&#xff09;2024论坛开幕。此次论坛吸引了全球众多零售业者的关注&#xff0c;7thonline第七在线创始人马克骏先生也应邀参与该论坛&#xff0c;共同探讨零售业的未来发展趋势。 …

【保姆级详细介绍JavaScript初识及基本语法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Java代码基础算法练习-判断学生成绩等级-2024.06.28

任务描述&#xff1a; 输入一个学生的成绩&#xff08;成绩大于等于 0 并小于等于 100&#xff09;&#xff0c;根据成绩判断学生成绩的等级。 60 分以下不及格&#xff1b;60-70 分为及格&#xff1b;70-80 分为中等&#xff1b;80-90 分为良好&#xff1b;90 分以上为优秀。 …

如何从iPhone恢复错误删除的照片

嘿&#xff0c;iPhone 用户&#xff01;作为一名苹果专业人士&#xff0c;我见过相当多的“哎呀&#xff0c;我删除了它&#xff01;”的时刻。今天&#xff0c;我在这里指导您完成从iPhone中恢复那些珍贵的&#xff0c;错误删除的照片的迷宫。坐下来&#xff0c;拿起你的设备&…

琴童杂志琴童杂志社琴童编辑部2024年第2期目录

成长空间 和钢琴成为一辈子的好朋友 赵宣萱; 4-5 弦外之音 雅克伊贝尔《室内乐小协奏曲》的演奏技术难点解析 张家睿;王韵然; 6-8 歌剧《艺术家的生涯》中咏叹调《人们叫我咪咪》的艺术特征和演唱处理 孙淼; 9-11《琴童》投稿&#xff1a;cn7kantougao163.com …

Transformer 结构

目录 一、Transformer 的整体结构二、Input Encoding三、Transformer Block3.1 Encoder3.1.1 Attention3.1.2 Self-attention3.1.3 Multi-head Attention 3.2 Decoder3.2.1 Masked Multi-head Attention 四、Transformer 的优缺点 遇到看不明白的地方&#xff0c;欢迎在评论中留…

spring boot 3.0.1多模块项目使用nacos动态配置

根pom文件增加&#xff0c;spring-cloud-alibaba包管理&#xff0c;注意版本spring-boot 3.0.3&#xff0c;spring-cloud-alibaba 2022.0.0.0-RC1 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

Redis--18--Redis Desktop Manage下载与安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis Desktop Manage1.官网下载https://redis.io/insight/ 2.安装方法3.使用方法3.1.进入RedisDesktopManager的主界面3.2 新建连接3.3 支持操作 Redis Desktop Ma…

RocketMQ快速入门:linux安装rocketmq并配置开机自启(十一)

目录 0. 引言1. 下载安装包1.1 高版本直接下载安装包1.2 下载源码包进行编译 2. namesrv和broker安装2.1 安装2.2 放开服务器端口2.3 测试 3. 配置开机自启3.1 配置namesrv开机自启3.2 配置broker开机自启 0. 引言 之前我们针对本机电脑安装rocketmq进行了讲解&#xff0c;同时…

QT在visual studio环境打开控制台窗口

明确需求 在VS环境中开发QT应用&#xff0c;有时遇到BUG想看日志&#xff0c;但是默认VS环境没有显示控制台窗口可看日志。 解决方法 对工程名单击右键。 点击属性&#xff0c;在打开界面按照如下图操作。 设置完成后弹出的控制台窗口如下图。

五线谱与简谱有什么区别 五线谱简谱混排怎么打 吉他谱软件哪个好

五线谱与简谱作为音乐记谱领域的两大主流系统&#xff0c;各自承载着深厚的历史渊源与独特的表现力&#xff0c;并在全球范围内被不同程度地接受和应用。尽管两者都是为了记录音乐作品中的音高和节奏信息&#xff0c;但其内在机制、适用范围以及学习曲线存在显著差别。下面我们…

Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)

01、第一章 Qt6.5.3安装 资源 Qt 国内下载地址清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/qt/archive/online_installers/Qt 阿里云盘下载Qt 安卓开发https://www.alipan.com/s/kNaues6CHaG点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极…

专业报考628

目录 掌上高考相关专业两步走 研招网、软科最后 刚才看了&#xff0c;挺有用的育 就是一点&#xff0c; 查找相关专业 掌上高考 如果不知道喜欢什么专业&#xff0c;直接查大学&#xff0c;就查那个大学有什么不是物化强行绑定的 看**招生计划**一栏 如果有明确目标&#xf…