当前位置: 首页 > news >正文

代码随想录刷题day42| 01背包理论基础分割等和子集

文章目录

  • day41学习内容
  • 一、 01背包之二维数组解法
    • 1.1、什么是01背包
    • 1.2、动态规划五部曲
      • 1.2.1、 确定dp数组(dp table)以及下标的含义
      • 1.2.2、确定递推公式
      • 1.2.3、 dp数组如何初始化
      • 1.2.4、确定遍历顺序
      • 1.2.5、计算并返回最终结果
  • 二、 01背包之一维数组解法
    • 2.1、动态规划五部曲
      • 2.1.1、 确定dp数组(dp table)以及下标的含义
      • 2.1.2、确定递推公式
      • 2.1.3、 dp数组如何初始化
      • 2.1.4、确定遍历顺序
        • 二维动态规划
        • 从二维到一维的转化
        • 为什么要逆序更新
        • 具体示例
  • 三、 分割等和子集
    • 3.1、动态规划五部曲
      • 3.1.1、 确定dp数组(dp table)以及下标的含义
      • 3.1.2、确定递推公式
      • 3.1.3、 dp数组如何初始化
      • 3.1.4、确定遍历顺序
      • 3.1.5、计算并返回最终结果
    • 1.3、代码
  • 总结
    • 1.感想
    • 2.思维导图


day41学习内容

day41主要内容

  • 01背包之二维数组解法
  • 01背包之一维数组解法
  • 分割等和子集

声明
本文思路和文字,引用自《代码随想录》

一、 01背包之二维数组解法

1.1、什么是01背包

1.2、动态规划五部曲

1.2.1、 确定dp数组(dp table)以及下标的含义

- 考虑前i个物品,当背包容量为j时的最大价值。或者说
- 从物品0到i之间,任意取一个物品放到重量为j的背包中的最大价值

1.2.2、确定递推公式

在0-1背包问题中,dp[i][j]通常表示在考虑前i个物品,且背包容量为j时,能够获得的最大价值。当我们在处理第i个物品时,面临的选择是:放入这个物品,或者不放入这个物品。

在0-1背包问题中,递推公式通常写为:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])

其中:

  • dp[i][j]:考虑前i个物品,当背包容量为j时的最大价值。
  • dp[i-1][j]:不放入第i个物品时,考虑前i-1个物品,背包容量为j的最大价值。
    • 如果选择不放入第i个物品,那么背包中的物品组合应该与考虑前i-1个物品时背包容量为j的情况相同。因为我们没有使用额外的容量来放置第i个物品,所以背包的容量和内容保持不变,相当于在做决策时忽略了第i个物品。
    • 因此,此时的公式为,dp[i-1][j],表示的是在不选择第i个物品的情况下,考虑前i-1个物品时能够获得的最大价值。这反映了一个关键的动态规划概念,即利用子问题的解来构建更大问题的解。
  • dp[i-1][j-w[i]] + v[i]:放入第i个物品时的情况,这里w[i]是第i个物品的重量,v[i]是第i个物品的价值。这表示,如果放入第i个物品,那么背包剩余容量为j-w[i],对应的最大价值应加上第i个物品的价值v[i]

1.2.3、 dp数组如何初始化

在01背包问题中,dp[i][j]表示在前i个物品中选择一些物品,使得这些物品的总重量不超过j时,这些物品的最大总价值。因此,dp[0][j]表示当没有物品可以选择时,任何容量j的背包的最大价值都是0,因为我们什么也装不进去。同样地,dp[i][0]表示当背包的容量为0时,不论有多少物品可供选择,我们都无法装入任何物品,所以最大总价值为0。

1.2.4、确定遍历顺序

从前向后遍历,没啥好说的

1.2.5、计算并返回最终结果


二、 01背包之一维数组解法

2.1、动态规划五部曲

2.1.1、 确定dp数组(dp table)以及下标的含义

-  dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

2.1.2、确定递推公式

直接给结论

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

2.1.3、 dp数组如何初始化

dp[0] = [0]

2.1.4、确定遍历顺序

需要逆序遍历。

二维动态规划

假设我们有两个物品,其中:

  • 物品1的重量为w[1] = 2,价值为v[1] = 3
  • 物品2的重量为w[2] = 3,价值为v[2] = 4
  • 背包的总容量为W = 5

我们使用二维数组dp[i][j]来表示考虑到第i个物品时,背包容量为j的最大价值。

初始化dp[0][j] = 0,因为没有物品时价值为0。对于每个物品i,我们遍历所有可能的背包容量j,更新dp[i][j]

从二维到一维的转化

关键点在于观察到更新dp[i][j]时,只需要前一行的信息,即dp[i-1][...]。因此,如果我们能确保在更新dp[j]时,dp[j-w[i]]总是代表加入当前物品前的状态,那么我们就可以只用一维数组来保存所有需要的信息。

为什么要逆序更新

假设我们正向更新,即j从小到大更新。当我们更新dp[j]时,dp[j-w[i]]可能已经被当前物品的加入更新过了,这意味着我们可能会错误地将同一个物品加入背包多次。

逆序更新(即j从大到小更新)确保在更新dp[j]时,dp[j-w[i]]还没有被当前物品的加入影响,因为我们还没有到达更小的j值。这样,每个物品只会被考虑加入一次。

具体示例

让我们以背包总容量W = 5为例,来具体分析这个过程。假设我们现在处理物品1(重量2,价值3)。

  • 在二维动态规划中,我们可能得到类似dp[1][j]的更新,其中j从1到5。

  • 转换为一维后,我们同样需要更新dp[j],但是逆序处理。

对于物品1,初始dp[0, 0, 0, 0, 0, 0](考虑容量从0到5)。

  • 正向考虑,如果我们先更新dp[2]为3(加入物品1),当我们到达dp[4]时,可能错误地再次考虑加入物品1,因为它看到的dp[2]已经反映了物品1的加入。

  • 逆序更新,我们从dp[5]开始往回看。当更新dp[5]时,dp[3](对应j-w[i])还未被更新,确保我们正确地只考虑加入物品1一次。

三、 分割等和子集

416.原题链接

3.1、动态规划五部曲

3.1.1、 确定dp数组(dp table)以及下标的含义

- ,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]。

3.1.2、确定递推公式

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

3.1.3、 dp数组如何初始化

dp[0] = 0,java中新建数组,会自动赋值所有的元素的值都为0

3.1.4、确定遍历顺序

逆序遍历

3.1.5、计算并返回最终结果

return dp[target] == target;

1.3、代码

class Solution {public boolean canPartition(int[] nums) {if(nums == null || nums.length == 0) return false;int n = nums.length;int sum = 0;for(int num : nums) {sum += num;}//总和为奇数,不能平分if(sum % 2 != 0) return false;int target = sum / 2;//开始背包逻辑int[] dp = new int[target + 1];for(int i = 0; i < n; i++) {for(int j = target; j >= nums[i]; j--) {// 此时价值为nums[i],重量也为nums[i]dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[target] == target;}
}

总结

1.感想

  • 好难好难。。。

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。

相关文章:

代码随想录刷题day42| 01背包理论基础分割等和子集

文章目录 day41学习内容一、 01背包之二维数组解法1.1、什么是01背包1.2、动态规划五部曲1.2.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…...

Python文件操作命令

文件操作 我知道你最近很累&#xff0c;是那种看不见的、身体上和精神上的疲惫感&#xff0c;但是请你一定要坚持下去。就算无人问津也好&#xff0c;技不如人也好&#xff0c;千万别让烦躁和焦虑毁了你的热情和定力。别贪心&#xff0c;我们不可能什么都有&#xff0c;也别灰心…...

CSS面试题---基础

1、css选择器及优先级 选择器优先级&#xff1a;内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意&#xff1a; !important优先级最高&#xff1b; 如果优先级相同&#xff0c;则最后出现的样式生效&#xff1b; 继承得到的样式优先…...

OpenHarmony实战开发-分布式数据管理

​介绍 本示例展示了在eTS中分布式数据管理的使用&#xff0c;包括KVManager对象实例的创建和KVStore数据流转的使用。 通过设备管理接口ohos.distributedDeviceManager &#xff0c;实现设备之间的kvStore对象的数据传输交互&#xff0c;该对象拥有以下能力详见 ;1、注册和解…...

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…...

C语言一维数组及二维数组详解

引言&#xff1a; 小伙伴们&#xff0c;我发现我正文更新的有些慢&#xff0c;但相信我&#xff0c;每一篇文章真的都很用心在写的&#xff0c;哈哈&#xff0c;在本篇博客当中我们将详细讲解一下C语言中的数组知识&#xff0c;方便大家后续的使用&#xff0c;有不会的也可以当…...

11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征&#xff0c;所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...

RVM安装ruby笔记

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…...

电力系统负荷预测方法

电力系统负荷是什么&#xff1f; 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础&#xff0c;以特定的数学方法或者建立数学模型的方式为手段&#xff0c;通过对电力负荷历史数据进行分析&#xff0c;对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白&#xff0c;内容未加载。 填坑&#xff1a; 打包配置要用相对路径 vite.config.ts文件中的base要改成./&#xff0c;之前加了项目…...

MySQL学习笔记(持续更行ing)

级别&#xff1a; 1. 了解&#xff0c;面试概率10% 2. 掌握&#xff0c;面试概率50% 3. 重点&#xff0c;面试概率80% 目录 1. 数据库**** 1.1. 概念**** 1.2. 分类**** 1.2.1. 关系型数据库**** 1.2.1.1. SQL**** 1.2.2. 安装**** 1.2.2.1. Navicat**** 1.2.3. 非…...

服务器配置Huggingface并git clone模型和文件

服务器配置Huggingface并git clone模型和文件 参考&#xff1a;https://huggingface.co/welcome 1 注册hugging face 官网注册&#xff0c;并获取token【https://huggingface.co/settings/tokens】&#xff0c;用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...

Rust 开发的高性能 HTTP 请求工具

一、简述 在现在的软件开发领域&#xff0c;HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说&#xff0c;能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目&#xff0c;它被设计来高效执行HTTP请求&#…...

Android Studio 通过 WIFI 调试手机 app

操作流程 首先第一步&#xff0c;PC 和手机都需要连在同一个局域网 WIFI。 第二步&#xff0c;手机 USB 连上 PC&#xff0c;确保能查看到通过 USB 连上的设备&#xff1a; >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...

RabbitMQ高级笔记

视频链接&#xff1a;【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…...

【Qt】QtCreator交叉编译环境配置Qt mkspec

1、问题描述 在QtCreator中配置TI AM437x的交叉编译环境后,编译时报错,错误信息如下 error: gnu/stubs-soft.h: No such file or directory2、原因分析 1)环境变量CC 搜索网络,解决方法为修改交叉编译工具目录下环境配置脚本,即执行source时的文件。 本人环境为:linux…...

点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…...

【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)

1. Redis客户端 Jedis 以redis命令作为方法名称&#xff0c;学习成本低&#xff0c;但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使用&#xff08;必须为每个线程分配独立的Jedis连接&#xff09; lettuce 基于Netty实现&#xff0c;支持同步、异步和…...

Java中Filter和Interceptor的区别

概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet&#xff0c;而Interceptor不…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...