代码随想录刷题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数组(dp table)以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…...
Python文件操作命令
文件操作 我知道你最近很累,是那种看不见的、身体上和精神上的疲惫感,但是请你一定要坚持下去。就算无人问津也好,技不如人也好,千万别让烦躁和焦虑毁了你的热情和定力。别贪心,我们不可能什么都有,也别灰心…...
CSS面试题---基础
1、css选择器及优先级 选择器优先级:内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意: !important优先级最高; 如果优先级相同,则最后出现的样式生效; 继承得到的样式优先…...
OpenHarmony实战开发-分布式数据管理
介绍 本示例展示了在eTS中分布式数据管理的使用,包括KVManager对象实例的创建和KVStore数据流转的使用。 通过设备管理接口ohos.distributedDeviceManager ,实现设备之间的kvStore对象的数据传输交互,该对象拥有以下能力详见 ;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.设置网络 视频地址: 05-Rab…...
C语言一维数组及二维数组详解
引言: 小伙伴们,我发现我正文更新的有些慢,但相信我,每一篇文章真的都很用心在写的,哈哈,在本篇博客当中我们将详细讲解一下C语言中的数组知识,方便大家后续的使用,有不会的也可以当…...
11.图像边缘检测的原理与实现
数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...
RVM安装ruby笔记
环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…...
电力系统负荷预测方法
电力系统负荷是什么? 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础,以特定的数学方法或者建立数学模型的方式为手段,通过对电力负荷历史数据进行分析,对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...
electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)
vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白,内容未加载。 填坑: 打包配置要用相对路径 vite.config.ts文件中的base要改成./,之前加了项目…...
MySQL学习笔记(持续更行ing)
级别: 1. 了解,面试概率10% 2. 掌握,面试概率50% 3. 重点,面试概率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模型和文件 参考:https://huggingface.co/welcome 1 注册hugging face 官网注册,并获取token【https://huggingface.co/settings/tokens】,用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...
Rust 开发的高性能 HTTP 请求工具
一、简述 在现在的软件开发领域,HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说,能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目,它被设计来高效执行HTTP请求&#…...
Android Studio 通过 WIFI 调试手机 app
操作流程 首先第一步,PC 和手机都需要连在同一个局域网 WIFI。 第二步,手机 USB 连上 PC,确保能查看到通过 USB 连上的设备: >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...
RabbitMQ高级笔记
视频链接:【黑马程序员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. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...
考研数学|《1800》+《660》精华搭配混合用(经验分享)
肯定不行,考研数学哪有这么容易的! 先说说这两本习题册,李永乐老师推出的新版660题,相较于18年前的版本,难度略有降低,更加适合初学者。因此,对于处于基础阶段的学习者来说,新版660…...
【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)
1. Redis客户端 Jedis 以redis命令作为方法名称,学习成本低,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用(必须为每个线程分配独立的Jedis连接) lettuce 基于Netty实现,支持同步、异步和…...
Java中Filter和Interceptor的区别
概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet,而Interceptor不…...
记一次 pdfplumber 内存泄漏导致的服务器宕机
有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…...
SpringBoot单元测试剖析
SpringBoot作为一种流行的Java框架,其单元测试的重要性不言而喻。在这篇博客中,我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节,它是对软件中的最小可测试单元进行检查和验证。对于…...
【华为OD机试C++】计算某字符出现次数
文章目录 描述输入描述输出描述示例代码 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1 \le n \le 1000 …...
ORA-01779 BYPASS_UJVC 11.2后废弃了
有这么个update语句 update A t set status 1 where exists (select 1 from B B where B.code A.code) 因性能问题需要修改写法。 在oracle10G这么update是没问题的: update( select …...
验证码demo(简单实现)
前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool🍬…...
C#面:虚函数和抽象函数的区别
C#中的虚函数和抽象函数都是实现多态性的重要概念,但它们有一些区别。 定义方式: 虚函数:在基类中使用 virtual 关键字定义,可以在派生类中被重写。抽象函数:在抽象类或接口中使用abstract 关键字定义,必…...
Vidmore Video Fix for Mac 视频修复工具
Vidmore Video Fix for Mac是一款功能强大且易于使用的视频修复工具,专为Mac用户设计。它凭借先进的视频修复技术,能够帮助用户解决各种视频问题,如视频文件损坏、无法播放、格式不支持等。 软件下载:Vidmore Video Fix for Mac v…...
Docker容器与虚拟化技术:OpenEuler 部署 Docker UI
目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…...
328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine
一、next、nextInt、nextLine区别 1.next() next()不光是接收键盘输入的内容,而且还进行分割。例如默认分隔符为空格 Scanner sc new Scanner(System.in);while (true){String str sc.next();System.out.println(str "A");}// 输出结果 input&#…...
HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)
同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…...
福田做棋牌网站建设/湖州seo排名
1、按字节读取文件内容 2、按字符读取文件内容 3、按行读取文件内容 4、随机读取文件内容 import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import jav…...
国内专门做酒的网站/百度app下载
题目:Remove Nth Node From End of List 删除链表从尾部到头部第N的节点。 思路: 两个指针,一个从头开始前移N个节点后,第二个指针开始移动,当第一指针移动到末尾时,第二个指针指向的是从尾部到头部的第N个…...
网站优缺点/百度软文推广怎样收费
2019独角兽企业重金招聘Python工程师标准>>> chart.js 基于H5的canvas,轻量级的图表插件。 有6中图表类型:折线图、条形图、雷达图、饼图、柱状图、极地区域图 关于柱状图的绘制,追加 、更新、删除数据等操作的总结 原文来自于:h…...
长沙建设网站企业/网店培训
(一)apache 介绍Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,Apache也叫万维网,www服务器, web服务器主要功能是提供网上信息浏览服务。Apache可以在大多数计算机操作系统中运行&…...
衢州建设公司网站/小红书代运营
心情良好转载于:https://www.cnblogs.com/qq3111901846/p/6178722.html...
人社局网站建设/网推是什么
ClassLoader翻译过来就是类加载器,普通的Java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,…...