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

背包问题的理论基础重中之重是01背包

01背包问题 二维

二维dp的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数组如何初始化:当j为0时,dp[i][0] = 0; 当i为0时,如果weight[0] > j, dp[0][j] = 0,否则dp[0][j] = value[0]
  4. 确定遍历顺序:因为下一个状态是由左上边和上面得到的,所以从前往后遍历,可以先遍历物品,也可以先遍历背包重量
  5. 举例推导dp数组:

def test_2_wei_bag_problem1(weight, value, bagweight):# 二维数组dp = [[0] * (bagweight + 1) for _ in range(len(weight))]# 初始化,因为数组在定义的时候已经初始化为0了,所以只需要把剩下不为0的重新初始化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]

01背包问题 一维

一维dp数组(滚动数组)

之前使用二维数组的时候,当前的状态是由上面一层[i-1] 正上方和左上方来决定,因为我们可以压缩物品这层数组,则当前的状态可以由自身和左边来决定。

如果背包继续从左向右遍历,则会覆盖掉左边的数据,右边的使用的就不是上层的数据。并且由于背包需要从右向左遍历,如果先遍历背包的话,背包中只会有一个物品

  1. 确定dp数组以及下标的含义:dp[j]表示容量为j的背包,价值最大是多少
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
  3. dp数组如何初始化:dp[0] = 0,假设物品价值都是大于0的,所以dp数组初始化的时候,都初始为0
  4. 确定遍历顺序:先遍历物品,再遍历背包重量,背包重量需要从后向前遍历
  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]

416. 分割等和子集

01背包的应用题

只有确定了如下四点,才能把01背包问题套到本题上来。

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

动态规划五部曲

  1. 确定dp数组以及下标的含义:dp[j]表示容量为j的背包,价值最大是多少。背包总容量是j,放进物品后,背的最大重量为dp[j]
  2. 确定递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
  3. dp数组如何初始化:本题题目中只包含正整数的非空数组,所以非0下标的元素初始化为0就可以了
  4. 确定遍历顺序:先遍历物品,再遍历背包重量,背包重量需要从后向前遍历
  5. 举例推导dp数组:
class Solution:def canPartition(self, nums: List[int]) -> bool:_sum = sum(nums)if _sum % 2 == 1:return Falsetarget = _sum // 2dp = [0] * (target + 1)for i in range(len(nums)):for j in range(target, nums[i]-1, -1):dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])if dp[target] == target:return Truereturn False

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

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

相关文章

vue3 使用pina

一、Vue 3 项目中集成Pina 状态管理库 要在 Vue 3 项目中使用 Pina&#xff08;Vue 3 状态管理库&#xff09;&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 安装 Pina 库相应的插件&#xff1a; yarn add pinia # 或者使用 npm npm install pinia 2. 在您的 Vue 3 项…

电脑休眠之后唤不醒

现象&#xff1a;午休时间电脑休眠了&#xff0c;醒来之后发现在密码输入界面&#xff0c;但鼠标键盘没反应。按重启键或电源机重新开机&#xff0c;结果开不了机。 原因&#xff1a;1、内存条脏了&#xff0c;导致内存条读取失败 2、休眠的时候硬盘休眠了&#xff0c;导致按…

如何在 CentOS 中配置 SSH 服务的 TCP 端口转发

在 CentOS 系统中&#xff0c;SSH&#xff08;Secure Shell&#xff09;服务提供了强大的功能&#xff0c;其中之一就是 TCP 端口转发。通过此功能&#xff0c;我们可以安全地将本地或远程服务器上的端口流量转发到其他主机上。本文将引导您如何在 CentOS 中启用或禁用 SSH 的 …

AngularJS安装版本问题

一、安装 Angular CLI 脚手架安装命令&#xff1a; npm install -g angular/cli 在安装前请确保自己安装NodeJS环境版本为V18及以上&#xff0c;否则会因node版本问题导致项目无法正常运行。 脚手架安装后&#xff0c;已提示了当前node版本必须为18.13.0或大于20.9.0版本&…

git之分支管理

一.理解分支 我们看下面这张图片&#xff1a; 在版本回退⾥&#xff0c;你已经知道&#xff0c;每次提交&#xff0c;Git都把它们串成⼀条时间线&#xff0c;这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前&#xff0c;只有⼀条时间线&#xff0c;在Git⾥&#xff0c;这个分⽀…

javaScript打印n以内的素数——试除法及优化

素数&#xff1a;只能被1和它本身整除 试除法 试除法的时间复杂度为O(n*sqrt(n))&#xff0c;空间复杂度为O(1)&#xff0c;这已经是一种比较高效的解决方案了。 n如果不是质数&#xff0c;那么能整除的数一定与根号n。基于此缩小循环比较范围&#xff0c;并且一旦找到可以整除…

数字签名在游戏里的应用

数字签名是一种电子形式的签名,用于验证数字文档、消息或交易的真实性和完整性。它是基于公钥加密技术,通过使用发送者的私钥来签名文档,然后使用发送者的公钥验证签名的正确性。数字签名不仅能证明信息没有被篡改,也能证明信息的发送者是真实的,因此在很多安全敏感的应用…

2024年 前端JavaScript入门到精通 第四天 笔记

4.1 函数的基本使用以及封装练习 ★ 函数命名规范 4.2 函数的参数以及默认参数 函数的灵魂&#xff01;&#xff01;&#xff01; 4.3 函数封装数组求和案例 4.4 函数返回值return 4.5 函数返回值细节以及上午总结 4.6 函数返回值案例-求最大值和最 4.7 函数复习以及断点进入函…

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

挑战杯 基于机器视觉的12306验证码识别

文章目录 0 简介1 数据收集2 识别过程3 网络构建4 数据读取5 模型训练6 加入Dropout层7 数据增强8 迁移学习9 结果9 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的12306验证码识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向…

springboot创建一个简单的web项目

要创建一个简单的Spring Boot Web项目&#xff0c;您可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;您需要安装Java开发环境。确保您已经安装了JDK&#xff08;Java Development Kit&#xff09;&#xff0c;并且已经配置了JAVA_HOME环境变量。 接下来&#xff0c;您…

Inno setup 打包jar包+前端dist+mysql+navicat等应用文件操作

目录 一、 使用exe4j将后端jar包打包成exe应用文件 1.创建一个新的工程 2.选择一个你想要存放的路径 3.进入配置界面 4.选择jar转换exe模式 5.自定义名字和选择输出路径 6.配置初始化 7.配置java环境 8.测试运行结果 二、Inno 打包应用文件exe 1.新建一个工程文件 2…

main函数中argc和argv是什么意思

在C和C中&#xff0c;int main(int argc, char* argv[])语句作为程序的入口&#xff0c;在main函数中常常用到。 argc&#xff1a;argument count&#xff0c;参数的数量。argc是一个整型数&#xff0c;代表传入程序的命令行参数的数量。程序名称是第一个参数&#xff0c;所以…

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组 解法1 将排序之后的字符串作为哈希表的键解法2 在解法一的基础上加入了getOrDefault ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f3…

获取用户信息与token理解

获取用户信息和token是在开发Web应用程序时常见的需求&#xff0c;可以通过以下步骤来实现&#xff1a; 用户登录&#xff1a;用户在应用程序中输入用户名和密码进行登录验证。一旦验证成功&#xff0c;应用程序会生成一个唯一的token&#xff0c;并将其返回给客户端。存储tok…

Nginx http.server.location配置项说明

在 nginx.conf 的 server 块中的 location / { } 部分,你可以配置许多不同的参数来控制如何处理进入的请求和响应。以下是一些常用的 location 块配置参数: proxy_pass: 用于将请求代理到另一个服务器。例如:proxy_pass http://backend_server; proxy_set_header: 用于设置传…

核函数概念

基本概念 核函数是在机器学习领域&#xff0c;尤其是在支持向量机&#xff08;SVM&#xff09;算法中常用到的一个概念。核函数的基本想法是通过一个非线性变换将原始数据映射到一个更高维的空间&#xff0c;在这个新的空间中&#xff0c;原本线性不可分的数据可能变得线性可分…

从零开始手写mmo游戏从框架到爆炸(二十二)— 战斗系统三

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 目录 地图设定 战斗引擎 服务端的BattleHandler 客户端的相关handler 战斗场景展示 执行效果 文接上一章。我们把战斗系统demo应用到实际的项目中来。在第十九章&#xf…

AI对话系统app开源

支持对接gpt&#xff0c;阿里云&#xff0c;腾讯云 具体看截图 后端环境&#xff1a;PHP7.4MySQL5.6 软件&#xff1a;uniapp 废话不多说直接上抗揍云链接&#xff1a; https://mny.lanzout.com/iKFRY1o1zusf 部署教程请看源码内的【使用教程】文档 欢迎各位转载该帖/源码

智慧公厕是什么?智慧公厕意义何在

随着城市化进程的加速&#xff0c;公厕成为城市管理中不容忽视的一环。智慧公厕传统的公厕管理方式已经无法满足当今社会的需求&#xff0c;因此智慧公厕的出现成为解决问题的利器。什么是智慧公厕&#xff1f;智慧公厕是实现公共厕所信息化、数字化、智慧化全方位管理与服务的…