leetcode动态规划(十)-0-1背包理论基础(一维数组)

一维dp数组(滚动数组)

leetcode中无纯0-1背包问题,可从卡码网上查看题目46.0-1背包问题

一维数组来源于二维数组,其本质是对一维数组进行压缩了,压缩后需要注意在进行背包容量循环的时候采用后序遍历,而不能采用前序遍历。

在使用二维数组的时候,递推公式为

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

表示在0-i个物品中任意挑选放进容量为j的背包里所能够获得的最大价值

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

这就是滚动数组的由来,需要满足的条件是上一层可以重复利用,直接拷贝到当前层。

还是动规五步曲

1.确定dp数组的定义

dp[j]表示容量为j的背包所能够背的最大价值是dp[j],继续沿用j来表示背包容量,和前面的二维数组能够有所对应,也便于思维上思考

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

二维的递推公式:dp[i][j] =max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])

去掉i这个维度得:dp[j]  = max(dp[j],dp[j-weight[i]]+value[i])

dp[j]表示容量为j的背包所能背的最大价值

dp[j-weight[i]]表示容量为j-weight[i]所能够背的最大价值

dp[j-weight[i]]+value[i]表示容量为j-weight[i]的背包里装了第i个物品后的最大价值

此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值

3.初始化

关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱

dp[j]表示容量为j的背包能够背的最大价值是dp[j]

当j=0的时候,即背包容量为0,那就是dp[0] = 0

其他的均可初始化为0

4.一维dp数组的遍历顺序

for i in range(n):for j in range(bagweight,weight[i]-1,-1):dp[j] = max(dp[j],dp[j-weight[i]]+value[i])

倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!

举一个例子:物品0的重量weight[0] = 1,价值value[0] = 15

如果正序遍历

dp[1] = dp[1 - weight[0]] + value[0] = 15

dp[2] = dp[2 - weight[0]] + value[0] = 30

此时dp[2]就已经是30了,意味着物品0,被放入了两次,所以不能正序遍历。

为什么倒序遍历,就可以保证物品只放入一次呢?

倒序就是先算dp[2]

dp[2] = dp[2 - weight[0]] + value[0] = 15 (dp数组已经都初始化为0)

dp[1] = dp[1 - weight[0]] + value[0] = 15

所以从后往前循环,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了。

切记这里一维数组中遍历的时候只能先遍历物品,再遍历背包容量,并且背包的容量只能后序遍历

5.举例dp数组

代码 

n,bagweight = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))#dp[j]表示容量为j的背包所背的最大价值
dp = [0]*(bagweight+1)
dp[0] = 0for i in range(n):for j in range(bagweight,weight[i]-1,-1):dp[j] = max(dp[j],dp[j-weight[i]]+value[i])print(dp[bagweight])

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

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

相关文章

世界500强,计算机校招月薪 1k ?

大家好,我是鸭鸭! 周末闲来无事,鸭鸭又来互联网冲浪了,没想到刷到这么一张图: 现在校招给计算机应届生开出的薪资只有 1~1k 了吗?鸭鸭很难不怀疑这是打错字了。 根据图里信息,这应…

【数据库设计】逻辑结构设计

E-R实体集的转换 概念结构设计之后就是对E-R图进行逻辑结构设计:即将E-R图转化成关系的过程。逻辑结构设计主要用于数据库管理系统上,为了让数据在计算机系统中更好地表示。 此设计过程用到的数据模型有:除了前面讲过的关系模型还有层次模型…

双十一该买什么比较好?双十一推荐好物清单分享

​是不是很多朋友跟我一样,已经为双11做好了准备,打算开启买买买的节奏!作为一名家居兼数码博主,每年双11的时候都会疯狂囤很多物品,所以今天就跟大家来分享一下,我的双11购物清单,也给大家参考…

数据结构部分混淆

1.随机存储和顺序存储: 随机存取:数组,当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物理地址无关 顺序存取:链表,当存储器中的数据被读取或写入时,所需要的时间与该数据所在的物…

Java:IDEA生成JavaDoc文档

有些开源项目并未直接提供api,但是通过从github、gitee下载项目可以手动生成Java文档。 步骤如下。 使用IDEA打开项目。 选择生成Java Doc文档: 第一步:选择生成JavaDoc文档的范围,我只对一个源文件生成Doc,所以选择…

鸿蒙开发超好用的 UI 组件和工具类库 BasicLibrary

大家好,我是 V 哥。你在学习HarmonyOS NEXT 开发吗,今天 V 哥给你推荐一款超好用的三方库BasicLibrary,BasicLibrary 是一个基于 API 11 封装的基本库,旨在提升鸿蒙开发效率。它包含了一些常用的 UI 组件和实用工具类,…

Java基础:面向对象编程8

1 Java 注解 1.1 概念 定义:注解(Annotation)是在 Java 1.5 时引入的概念,同 class 和 interface 一样,属于一种类型。作用:注解提供了一系列数据用来装饰程序代码(类、方法、字段等&#xff…

git配置以及如何删除git

你努力学习和充实自己,除了提升自身的价值,最实际的是当遇到有喜欢的人和事的时候,除了一片真心,还有拿得出手的东西 作用 记录开发的历史,每次记录就是一个版本,而且可以回到历史的某个版本可以实现多人合…

浅谈普通学历编码学生代码编程之路--24程序员节

#1024程序员节 | 征文# 今夕已是2024年,楼主是一名大四学生 ,即将进入社会,曾经总是拿码农来开程序员的玩笑 ,也是也是幻想着成为一名码农啊,先说说个人学习Java之路 ,从步入大学开始就是主学Java&#xff…

【MyBatis】MyBatis缓存原理详解

目录 一、简介 二、缓存类介绍 2.1 PerpetualCache 2.2 LruCache 2.3 BlockingCache 三、CacheKey 3.1 总结:二级缓存命中条件 四、一级缓存 五、二级缓存 5.1 二级缓存如何组装这些装饰器?(解析SQL映射文件中的标签,初…

2025青海选调生报名指南及照片要求

第一步:用户信息注册,仔细阅读公告内容 第二步:人脸识别认证、上传照片 第三步:确认基本信息、照片确认 第四步:填写报考信息,请务必于11月5日18:00前提交 第五步:打印报名表,下载《…

.net framework 3.5sp1插件怎么安装

以下是在不同操作系统电脑上安装.NET Framework 3.5 SP1 的几种常见方法: 一、Windows 10 及以上操作系统: 1.在线安装(需要网络连接稳定): 按键盘上的 Windows 键,键入 “Windows 功能”,然…

Linux网络编程(五)-什么是TCP/IP协议族全面解读

1.什么是TCP/IP协议族 在了解TCP和UDP之前,我们先了解TCP/IP协议族,首先这个协议族的的由来,在一开始很多电脑表达一个消息的方法可谓是多种多样,因为它们运行着完全不同的操作系统,这就像有不同口音,说不…

【9712】基于springboot+vue的校园台球厅人员与设备管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 本次设计任务是要设计一个校园台球厅人员与设备管理系统…

基于java+springboot的大型超市数据处理系统

文章目录 前言技术介绍功能介绍核心代码数据库参考 系统效果图 前言 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,大型超市数据处理系统当然不能排除在外。大型超市数据处理系统是在实际应用…

SpringBoot框架实战:打造宠物用品电商平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

SpringCloud之注册中心Consul使用详解

SpringCloud之注册中心Consul使用详解 在上个月我们知道 Eureka 2.X 遇到困难停止开发了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之…

深入探索Python集合(Set)的高效应用:数据处理、性能优化与实际案例分析

文章目录 前言🪁一、 定义集合1.1 使用大括号 {} 定义集合1.2 使用 set() 函数定义集合 🪁二、添加元素2.1 使用 add() 方法2.2 使用 update() 方法 🪁三、移除元素3.1 使用 remove() 方法3.2 使用 discard() 方法3.3 使用 pop() 方法3.4 使用…

【氮化镓】低温对p-GaN HEMT迁移率、阈值电压和亚阈值摆幅的影响

本期分享一篇低温对p-GaN HEMT 迁移率、阈值电压和亚阈值摆幅影响进行表征和建模的研究论文。文章作者Shivendra Kumar Singh、Thien Sao Ngo、Tian-Li Wu(通讯作者)和Yogesh Singh Chauhan,分别来资源中国台湾阳明交通大学国际半导体技术学院、印度理工学院坎普尔分校电气工…

缓存常见问题:缓存穿透、雪崩、击穿及解决方案分析

1. 什么是缓存穿透,怎么解决? 缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时…