[AcWing算法基础课]动态规划之01背包

题目链接:01背包

        有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

        首先,我们应该找到“01背包”问题的一个特点就是每件物品只能使用一次。 对于每一个物品,我们只需要考虑“选”或“不选”,这可能就是名字的来源吧。

        “01背包”问题适合使用动态规划算法解决,也就是“记住求过的解来节省时间”。

        下面先给出“01背包”问题的模板:

    // v[i]->体积  w[i]->价值 // f[i][j] 放入第i个物体,背包容量为j时的总价值for(int i = 1;i <= n;i++){  //动态规划for(int j = 0;j <= m;j++){if(v[i] <= j){f[i][j] = max(f[i-1][j],f[i-1][j-v[i]]+w[i]);}}}int res = 0;  //最优解for(int j = 0;j <= m;j++){res = max(res,f[n][j]);}

        接下来给大家举一个例子演示一下,方便大家理解。

        我们假设有4个物品,并把每一个物品响应的体积和价值标注出来(下图的左侧),然后设置书包的体积为5。大家应该可以发现:

  • 放入0个物品时,无论体积为多少,价值都为0。所以第一行全部填0
  • 当书包的体积为0时,不能放入任何物品,价值也都为0。所以第一列全部填0

        接下来看放入第1个物品会发生什么变化,也就是完善第二行 。

        便于理解的解释:第1个物品的体积为1,价值为2。当书包体积 j = 1时, j = v [ i ],可以放入第1个物体,故此时书包的价值为2。当书包体积 j > 1时, j > v [ i ],都可以放入第1个物体,故此时书包的价值仍然为2。第二行填完了。

        基于代码的解释:当书包体积 j = 1时,我们考虑是否放入第1个物品:

  • 不放入,那么书包的价值 f [1][1] 和 f [0][1]相同。(没放入任何物品,无论书包体积为多少,书包的价值都为0)。
  • 放入,那么书包的价值 f [1][1] 就应该看放入第0个物品,书包的体积为1减去第1个物品的体积1时,书包的价值(1 - 1 = 0)。简单来说,现在书包的体积(j = 1)减去第1 个物品的体积 (v [1] = 1)应该等于放入第0个物品时书包的体积(j - v [1] = 1 - 1 = 0)。只有放入第0个物体,书包体积为0时,我才能在书包体积为1时放入第1个物体,否则放不下。

        对于这两种情况,我们应该选择最优的方法,也就是比较这两种方法的价值,取最大值。

        接下来看放入第2个物品会发生什么变化,也就是完善第三行 。

        接下来看放入第3个物品会发生什么变化,也就是完善第四行 。

        接下来看放入第3个物品会发生什么变化,也就是完善第四行 。 

 

        以上就是动态规划的“01背包”求解过程,大家多模拟几遍肯定会有更多的感悟!

        希望大家学有所获!

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

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

相关文章

【机器学习】机器学习中用到的高等数学知识

机器学习是一个跨学科领域&#xff0c;涉及多种高等数学知识。以下是一些在机器学习中常用的数学概念和技术&#xff1a; 1. 线性代数 (Linear Algebra) 向量和矩阵&#xff1a;用于表示数据集和特征。矩阵运算&#xff1a;加法、乘法和逆矩阵等&#xff0c;用于计算模型参数…

FreeRTOS 24:事件组EventGroup等待、清零、获取操作

等待事件标志位xEventGroupWaitBits() 既然标记了事件的发生&#xff0c;那么我怎么知道他到底有没有发生&#xff0c;这也是需要一个函数来获 取 事 件 是 否 已 经 发 生 &#xff0c; FreeRTOS 提 供 了 一 个 等 待 指 定 事 件 的 函 数 — — xEventGroupWaitBits()&…

世界坐标和Local坐标的区分

TargetPos.position(-TargetPos.forward*-4)TargetPos.up*7 这是相对于TargetPos的位置进行偏移&#xff0c; 动态的与Target的本地坐标改变 new Vector3(TargetPos.position.x, TargetPos.position.y 7, TargetPos.position.z - 5) 这个是直接new了一个世界坐标的Vector3 &…

Ubuntu 22.04 的Python3.11.8 安装

背景 新版本的Python需要更高版本的OpenSSL 依赖。使用操作系统的SSL不然会提示缺少SSL的报错。 部署 ## Openssl部署 wget https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz## ./config --prefix/usr/local/openssl make &&…

在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码

在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码 在Ubuntu下安装RabbitMQ可以按照以下步骤进行&#xff1a;步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 更新APT索引并安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: …

nacos单机源码解析-服务发现和心跳检测

目录 1 服务发现 1.1 客户端 1.1.1 入口 1.1.2 定时拉取 1.1.3 总结 1.2 服务端 2 心跳检测 2.1 客户端 2.2 服务端 2.2.1 处理心跳请求 2.2.2 开启定时任务进行心跳检测 2.2.3 总结 1 服务发现 服务列表&#xff1a;Nacos 维护一个服务列表&#xff0c;记录所有已注…

在线绘制带community的蛋白质-蛋白质相互作用(PPI)网络图

导读&#xff1a;分子相互作用网络图揭示了细胞内部分子间的复杂相互作用。通过识别网络中密集连接的节点所形成的社区&#xff08;community&#xff09;&#xff0c;可以揭示它们之间以前未知的功能联系。这些社区可能代表了具有共同功能的功能模块&#xff0c;对于理解细胞生…

【商城系统搭建流程】

商城系统的搭建流程可以分为以下几个步骤&#xff1a; 1.需求分析&#xff1a;确定商城系统的功能和特性&#xff0c;例如商品展示、购物车、订单管理、支付等。 2.系统设计&#xff1a;根据需求分析结果设计商城系统的架构&#xff0c;包括前端页面设计和后端数据库设计。 …

qt QTableView详解

1、概述 QTableView 是 Qt 框架中的一个高级视图类&#xff0c;用于以表格形式展示二维数据。它基于 QAbstractItemView&#xff0c;并与模型&#xff08;通常是 QAbstractTableModel 或 QStandardItemModel&#xff09;结合使用&#xff0c;以实现数据的展示和交互。QTableVi…

Orleans集群及Placement设置

服务端界面使用相同的clusterid和serviceid&#xff0c;相同ip地址&#xff0c;不同网关端口号和服务端口号&#xff0c;启动两个silo服务&#xff0c;并使用MySql数据库做Silo间信息同步&#xff0c;实现集群。 silo服务启动代码如下&#xff08;从nuget下载Microsoft.Orleans…

OceanBase 4.3.3 功能解析:列存副本

OceanBase 从4.3.0 版本开始&#xff0c;引入了列式存储的支持。用户可以根据业务的具体需求&#xff0c;选择创建列存表、行存表或是行列混存表。无论选择哪种表类型&#xff0c;在不同的Zone内&#xff0c;租户使用的副本模式都是一致的。详见官网文档&#xff1a; https://w…

【Linux】 IPC 进程间通信(三)(消息队列 信号量)

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 一、消息队列 &#x1f48c;…

如何管理PHP API版本

管理PHP API版本是确保API稳定性和兼容性的关键步骤。以下是一些有效的PHP API版本管理方法&#xff1a; 一、使用命名空间和类库 在PHP中&#xff0c;可以通过命名空间和类库来实现API版本的管理。通过为不同版本的API创建不同的命名空间&#xff0c;可以将它们隔离开来&…

Docker:镜像构建 DockerFile

Docker&#xff1a;镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中&#xff0c;大部分都是基础镜像&#xff0c;他们只提供某个简单的功能&#xff0c;如果想要一个功能更加丰富…

遥控器数图控链路系统核心技术+算法详解

一、核心技术 无线通信技术 遥控器数图控链路系统主要基于无线通信技术进行数据传输。通过特定的调制、编码和信号处理技术&#xff0c;将遥控器的操作指令转化为无线电信号&#xff0c;并传输给被控制设备。被控制设备接收到信号后&#xff0c;再将其解码为可识别的指令&…

Kafka 源码 KRaft 模式本地运行

KRaft&#xff08;Kafka Raft Metadata mode&#xff09;&#xff0c;从版本 2.8.0 开始作为测试特性引入&#xff0c;并在后续版本中持续得到改进和增强。 KRaft 模式是指 Kafka 使用 Raft 协议来管理集群元数据的一种运行模式&#xff0c;这标志着 Kafka 向去除对 ZooKeeper …

Java:使用Jackson的jsonPtrExp获取节点值的问题说明

使用Jackson时解析json时&#xff0c;经常会使用jsonPath直接获取某一节点下的值&#xff0c;这种方式非常直观 &#xff0c;例如&#xff1a; { “data”: { "test1": "value1", "test2": null, "test3": 10 } } 以Jackson2.13.5&…

链表存储密度

链表的存储密度是一个衡量链表空间利用率的指标。为了理解链表的存储密度&#xff0c;我们需要先简单了解一下链表的基本结构和特点。 链表的基本结构 链表是一种线性数据结构&#xff0c;其中每个元素&#xff08;称为节点&#xff09;包含两部分&#xff1a; 数据域&#…

Android下的系统调用 (syscall),内联汇编syscall

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 什么是系统调用 (syscall) 系统调用是操作系统提供给应用程序的一组接口&#xff0c;允许用户空间程序与内核进行交互。 在 Android&#xff08;基于 Linux …

大语言模型安全威胁

文章目录 基座安全一、大模型训练阶段&#xff08;1&#xff09;训练环境安全风险&#xff08;2&#xff09;训练环境隔离缺陷 二、大模型部署阶段&#xff08;1&#xff09;利用不安全系统配置&#xff08;2&#xff09;CI&CD流程攻击&#xff08;3&#xff09;部署环境组…