代码随想录算法训练营day44 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集

01背包问题 二维

1. 确定dp数组以及下标的含义

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

2. 确定递推公式

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

3. dp数组如何初始化

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。

当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

4. 确定遍历顺序

有两个遍历的维度:物品与背包重量,遍历哪个都可以

5. 举例推导dp数组

def test_2_wei_bag_problem1(weight, value, bagweight):# 二维数组dp = [[0] * (bagweight + 1) for _ in range(len(weight))]# 初始化for j in range(weight[0], bagweight + 1):dp[0][j] = value[0]# weight数组的大小就是物品个数for i in range(1, len(weight)):  # 遍历物品for j in range(bagweight + 1):  # 遍历背包容量if j < weight[i]:dp[i][j] = dp[i - 1][j]else:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])return dp[len(weight) - 1][bagweight]if __name__ == "__main__":weight = [1, 3, 4]value = [15, 20, 30]bagweight = 4result = test_2_wei_bag_problem1(weight, value, bagweight)print(result)

01背包问题 一维

可以发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);

与其把dp[i - 1]这一层拷贝到dp[i]上,不如只用一个一维数组了,只用dp[j](一维数组,也可以理解是一个滚动数组)。

1. 确定dp数组的定义

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

2. 一维dp数组的递推公式

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

3. 一维dp数组如何初始化

假设物品价值都是大于0的,所以dp数组初始化的时候,都初始为0就可以了

4. 一维dp数组遍历顺序

二维dp遍历的时候,背包容量是从小到大,而一维dp遍历的时候,背包是从大到小。倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!

两个嵌套for循环的顺序,代码中是先遍历物品嵌套遍历背包容量,那可不可以先遍历背包容量嵌套遍历物品呢?不可以!因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。

5. 举例推导dp数组

def test_1_wei_bag_problem(weight, value, bagWeight):# 初始化dp = [0] * (bagWeight + 1)for i in range(len(weight)):  # 遍历物品for j in range(bagWeight, weight[i] - 1, -1):  # 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i])return dp[bagWeight]if __name__ == "__main__":weight = [1, 3, 4]value = [15, 20, 30]bagweight = 4result = test_1_wei_bag_problem(weight, value, bagweight)print(result)

416. 分割等和子集

套用01背包

背包的体积为sum / 2。背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值。背包如果正好装满,说明找到了总和为 sum / 2 的子集。

  1. 确定dp数组以及下标的含义:dp[j]表示容量为j的背包,所背物品的最大价值可以为dp[j]。套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]。
  2. 确定递推公式:dp[j] = max(dp[j], dp[j-nums[i]]+nums[i])
  3. dp数组初始化:本题题目中只包含正整数的非空数组,所以非0下标的元素初始化为0就可以了。
  4. 确定遍历顺序:如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!
  5. 举例推导dp数组
class Solution:def canPartition(self, nums: List[int]) -> bool:_sum = sum(nums)if _sum % 2 == 1:return Falsedp = [0] * (_sum//2 + 1)for num in nums:for j in range(_sum//2, num-1, -1):dp[j] = max(dp[j], dp[j-num] + num)return dp[_sum//2] == _sum//2稍微简化写法
class Solution:def canPartition(self, nums: List[int]) -> bool:_sum = sum(nums)if _sum % 2 == 1:return Falsetarget = _sum//2dp = [0] * (target + 1)for num in nums:for j in range(target, num-1, -1):dp[j] = max(dp[j], dp[j-num] + num)return dp[target] == target

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

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

相关文章

有多少苹果用来分赃

题目描述&#xff1a; 有5个人偷了一堆苹果&#xff0c;他们准备在第二天进行分赃。晚上&#xff0c;有一个溜出来&#xff0c;他把所有苹果分成了5份&#xff0c;但是多了一个&#xff0c;他顺手把多的一个苹果扔给树上的猴子&#xff0c;自己先拿1/5藏了起来。没想…

字节跳动Seed-TTS文本到语音模型家族

字节跳动的SEED TTS&#xff08;Seed-TTS&#xff09;是一系列大规模自回归文本转语音&#xff08;TTS&#xff09;模型&#xff0c;能够生成与人类语音几乎没有区别的高质量语音。该模型在语音上下文学习方面表现出色&#xff0c;尤其在说话者相似度和自然度方面的表现&#x…

Python 编程时可能会遇到各种错误提示

下是一些常见的 Python 错误提示及其简要解释&#xff1a; SyntaxError&#xff08;语法错误&#xff09; 示例&#xff1a;File "<stdin>", line 1, in <module> print("Hello, World! &#xff08;缺少闭合括号&#xff09;解释&#xff1a;Pyth…

篇1:Mapbox Style Specification

目录 引言 地图创建与样式加载 Spec Reference Root sources type:vector矢量瓦片

特惠电影票api接口文档,宜选影票接口文档不断优化

宜选影票接口文档的优化是一个持续的过程&#xff0c;旨在提高API的易用性、稳定性和安全性。以下是根据参考文章和相关经验&#xff0c;对宜选影票接口文档优化的一些建议&#xff0c;采用分点表示和归纳的方式&#xff1a; 1. 明确接口目标和功能 清晰定义&#xff1a;在接…

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

JavaScript第十讲:DOM编程(1):节点概念,如何获取元素节点,节点属性,样式练习题

前言 上一节是本文的知识点讲解&#xff0c;有需要的码客们先看一下&#xff0c;本文是练习题 题目要求 编写一个HTML文档&#xff0c;展示DOM编程的基础知识&#xff0c;包括节点概念的理解、如何获取元素节点、节点属性的操作以及样式调整。要求文档中包含一个带有特定ID的…

【MySQL】表的基本操作

&#x1f30e;表的基本操作 文章目录&#xff1a; 表的基本操作 创建查看表       创建表       查看表结构 表的修改       表的重命名       表的添加与修改       删除表结构 总结 前言&#xff1a; 在数据库中&#xff0c;数据表是存储和组…

vue脚手架 笔记01

01 页面组件 所谓的组件就是把页面每一块内容单独分离出去封装起来 组件包括自己本身的html css 和 js 可以被反复引入使用 (复用) 方便后期维护(方便快速的增加或者删除指定页面的指定模块) 组件化开发: 组件是独立的可复用的代码组织单元 组件系统是vue核心特性之一 组件分类…

鸿蒙状态管理-@Builder自定义构建函数

Builder 将重复使用的UI元素抽象成一个方法 在build方法里调用 使其成为 自定义构建函数 Entry Component struct BuilderCase {build() {Column(){Row(){Text("西游记").fontSize(20)}.justifyContent(FlexAlign.Center).backgroundColor("#f3f4f5").hei…

vue课后习题及答案

第一章 初识vue.js 一.填空题 1.Vue是一套用于构建___用户界面_____的渐进式框架. 2.Vue中的指令以______v-__开头. 3.Node.js 是一个基于____V8___引擎的JavaScript运行环境。 4.在yam 中&#xff0c;__yarn add__命令用于添加指定名称的包。 5.在 npm 中&#xff0c;___…

性能测试-测试方法总结(压力/负载)超详细

前言 并发/负载/压力理解 负载测试&#xff1a;通过不断加压使系统达到瓶颈&#xff0c;为调优提供参考数据 压力测试&#xff1a; 稳定性压力测试&#xff1a;在不同的给定的条件下&#xff08;比如内存的使用&#xff0c;一定时间段内有多少请求等&#xff09;&#xff0c…

IEAD常用快捷键

如题 网页图片不清晰&#xff0c;可下载后查看

【SHUD】PIHMgis编译过程(下)sundials及PIHM编译过程

文章目录 说明sundials编译sundialssundials源代码下载MINGW下sundials编译过程CMAKE下sundials编译过程(推荐)PIHM编译过程安装QT 5导入项目配置VSVS使用静态库文件qt deployment toolgdal.dll编译PIHMgis成功编译

代码随想录算法训练营Day60 | 84.柱状图中最大的矩形

代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 LeetCode 84.柱状图中最大的矩形 题目链接&#xff1a;LeetCode 84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {int result 0;stack<int> st;height…

NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. Power Supply子系统介绍 2. Power Supply子系统框架 3. Power Supply代码分析 本章节主要介绍Linux 下的P…

具体因字数问题

问题描述 给定整数 n n n&#xff0c;在 O ( 1 ) O(1) O(1) 时间求出 n n n 有多少个因子。 问题背景 \qquad 目前网上求因子个数的方法的时间复杂度都是 O ( n ) O(\sqrt{n}) O(n ​) 级别的&#xff0c;但我认为一定有一种方法可以在 O ( 1 ) O(1) O(1) 的时间求出 n…

插入排序——表插入排序

目录 1、简述 2、复杂程度 3、稳定性 4、实例 1、简述 表插入排序&#xff08;Table Insertion Sort&#xff09;是一种基于插入排序的排序算法&#xff0c;它通过维护一个已排序的索引表来加速插入操作。在标准插入排序中&#xff0c;每次插入一个新元素时&#xff0c;需…

vs2019 c++20 规范的头文件 <future> 源码注释和几个结论

&#xff08;1 探讨一&#xff09;在多线程中&#xff0c;需要线程返回值的可以用该头文件中的类。该头文件中模板类和模板函数定义很多&#xff0c;用一幅图给出模板类之间的关系&#xff0c;方便从整体上把握和记忆&#xff1a; &#xff08;2&#xff09;

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…