代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础

学习资料:代码随想录 (programmercarl.com)

 相关链接:题目页面 (kamacoder.com)

背包题目分类

01背包定义

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

解法

暴力解法

每种物品有两种状态:取或不取,因此可以用回溯法搜索出所有组合,选出价值最大的方案,时间复杂度为o(2^n)。

动态规划

举例:背包重量为4,物品为:

1. dp[i][j]定义

当前背包容量为j时, 从下标为[0, i]的物体中任意取,放到背包中,的最大价值。

    示意图如下:

   

2.递推公式

dp[i][j]可以从两个方向得到:

  • 放物品i: 由dp[i - 1][j - weight[i]]推出,即不放物品i时,容量为[j - weight[i]的背包(要给物品i流出放的重量)时的最大价值加上物品i的价值。
  • 不放物品i:由dp[i-1][j]推出,即容量为j,不放物品i时的最大价值。

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

3. 初始条件
  • 当背包容量为0时,那么不管从哪几个物体中选,最大价值总为0.
  • 当i为0时,即只能选择放入物品0或不放入物品0,想得到最大价值,肯定选择物品0最好, 但如果物品0重量大于背包容量时就无法放入,最大价值为0。
4. 遍历顺序

dp[i][j]由[i][j]位置的上方或者左上方得到,可以先遍历物品,也可以先遍历容量,我选择前者。具体步骤如下:

首先从dp[1][1]开始计算,当前物品1的重量(3)超过了背包总容量(1),所以无论之前的物品(这里指物品0)有没有放入背包,物品1都不可能放进去,所以背包的最大价值和在当前容量下放入物品1前的最大价值相同,即dp[1][1] = dp[0][1] = 15。dp[1][2]同理。

当背包扩容到3(即j = 3)时,直观来看,我们可以选择放入物品1,如果放入,就不能同时放入物品0,那么价值为20,如果不放物品1,可能的最大价值为只放物品0的价值,即15,因为20>15, 所以dp[1][3] = 20。把上述想法抽象总结如下:

容量大于物品1的容量,说明可以放入物品1。如果放入物品1,那留给前面的物体(这里指物品0)的容量只有j-wright[j](这里为0),所以前面物体能创造的最大价值为dp[i-1][j-weight[j]], 加上物品j后的价值为dp[i - 1][j - weight[j]] + value[i], 如果不放入物品1,那就和之前的情况一样,即dp[i-1][j]。取这两种情况价值大的,即max(dp[i - 1][j - weight[j]] + value[i], dp[i-1][j])。

5. 举例推导dp数组

在纸上举例,能写出下面的数组。

代码实现

在ACM模式下,Python的输入模式基础语句为下:

# 读取一个整数
n = int(input()) # 一行里有n个整数, 表示数据
a = list(map(int, input(),split()))# 一行里面有两个整数
n, m = map(int, input().split()) # 如果有多行数据,则按照每行的顺序依次执行上述对应指令
objNum, bagWeight = map(int, input().split())weight = [int(i) for i in input().split()]
value = [int(i) for i in input().split()]dp = [[0]*(bagWeight+1) for i in range(objNum)]
for j in range(bagWeight+1):if j >= weight[0]:dp[0][j] = value[0]for i in range(1, objNum): # 遍历for j in range(1, bagWeight+1):if weight[i] > j:dp[i][j] = dp[i-1][j]else:dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i])print(dp[objNum - 1][bagWeight])

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

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

相关文章

企业飞书应用机器人,使用python自动发送文字内容到群消息

文章目录 创建企业应用与开通机器人飞书发送信息的工具函数 创建企业应用与开通机器人 需要先创建应用,然后进入应用后,点击添加应用能力创建机器人: 参考官方文档,获取两个参数:app_id与app_secret 官方说明文档&…

【DC渗透系列】DC-4靶场

主机发现 arp-scan -l┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:6b:ed:27, IPv4: 192.168.100.251 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.100.1 00:50:56:c0:00:08 …

电力负荷预测 | 基于AE-LSTM的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于AE-LSTM的电力负荷预测(Python) 基于AE-LSTM(自动编码器长短期记忆网络)的电力负荷预测是一种基于深度学习的方法,用于预测未来一段时间内的电力负荷需求。该方法结合了自动编码器和LSTM网…

FastDFS安装并整合Openresty

FastDFS安装 一、环境--centos7二、FastDFS--tracker安装2.1.下载2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.文件安装位置介绍2.8.错误处理2.9.配置FastDFS跟踪器(Tracker)2.10.启动2.11…

MVC框架学习

大一的时候写过一个mvc框架的跑酷游戏,但是那时候基础不扎实,没学明白也没听懂。现在深入的学习一下 以下内容参考:MVC 模式 | 菜鸟教程 (runoob.com) MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器&#xff…

【DDD】学习笔记-数据分析模型

在 Eric Evans 提出领域驱动设计之前,对企业系统的分析设计多数采用数据模型驱动设计。如前所述,这种数据模型驱动设计就是站在数据的建模视角,逐步开展分析、设计与实现的建模过程。通过对数据的正确建模,设计人员就可以根据模型…

如何在Mac上允许主流浏览器使用弹出式窗口?这里有详细步骤

这篇文章教你如何关闭流行的Mac浏览器上的弹出窗口阻止程序,包括Safari、Chrome和Firefox。它还探讨了你可能希望这样做的原因及其影响。 如何在Mac上允许Safari使用弹出窗口 如果你经常在Mac上使用Safari,你会注意到默认情况下弹出窗口阻止程序是打开的。有时,这并不方便…

vim常用命令以及配置文件

layout: article title: “vim文本编译器” vim文本编辑器 有三种模式: 命令模式 文本模式, 末行模式 vim命令大全 - 知乎 (zhihu.com) 命令模式 插入 i: 切换到输入模式,在光标当前位置开始输入文本。 a: 进入插入模式,在光标下一个位置开始输入文…

springboot172基于springboot的二手车交易系统的设计与实现

二手车交易系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统二手车交易信息管理难度大&…

three.js 匀速动画(向量表示速度)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div>1. 匀速动画(向量表示速度)</div…

4.1 Verilog 过程结构

关键词&#xff1a;initial&#xff0c; always 过程结构语句有 2 种&#xff0c;initial 与 always 语句。它们是行为级建模的 2 种基本语句。 一个模块中可以包含多个 initial 和 always 语句&#xff0c;但 2 种语句不能嵌套使用。 这些语句在模块间并行执行&#xff0c;…

[SAP ABAP] 创建Package

Package被称作包或开发类&#xff0c;能够存储所有SAP系统开发过程中的相关对象&#xff0c;方便进行管理和查询 我们可以通过Package实现其所包含的对象在不同服务器之间进行批量传输(通过请求号传输) 请求号是文件&#xff0c;用于记录所有对象的创建与修改记录 1.创建Packag…

嵌入式学习之Linux入门篇笔记——8,Linux帮助手册讲解

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.Linux 帮助手册 使用 man 命令打开&#xff0c;使用手册一共有…

Lombok 高级说明

优质博文&#xff1a;IT-BLOG-CN 一、痛点 【1】代码臃肿&#xff1a;POJO中的getter/setter/equals/hashcode/toString等&#xff1b; 【2】样板式代码&#xff1a;I/O流的关闭操作等&#xff1b; Lombok是一个可以通过注解简化Java代码开发的工具&#xff0c;能够在我们编…

个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程

个体诊所门诊电子处方开单管理系统软件&#xff0c;配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明&#xff0c;最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中&#xff0c;医师开单可谓是争分夺秒&…

ArcGIS学习(四)坐标系-1

ArcGIS学习(四)坐标系 大家平时在处理数据的时候肯定经常遇到坐标系相关的问题。最常见的就是同一个地区的两个数据,导入ArcGIS内却对不上;也肯定听到过坐标系相关的一些词语,比如地理坐标系投影坐标系、投影、WGS1984坐标、CGCS2000坐标系、火星坐标系、百度坐标系等。 …

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家&#xff01;&#xff01;&#xff01; 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;其已经被集成在re…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

统一数据格式返回,统一异常处理

目录 1.统一数据格式返回 2.统一异常处理 3.接口返回String类型问题 1.统一数据格式返回 添加ControllerAdvice注解实现ResponseBodyAdvice接口重写supports方法&#xff0c;beforeBodyWrite方法 /*** 统一数据格式返回的保底类 对于一些非对象的数据的再统一 即非对象的封…

Verilog刷题笔记28

题目&#xff1a; A “population count” circuit counts the number of 1’s in an input vector. Build a population count circuit for a 255-bit input vector. 解题&#xff1a; module top_module( input [254:0] in,output [7:0] out );int i;always(*)beginout8b0;…