【Leetcode每日一题】 01背包 - DP41 【模板】01背包(难度⭐⭐)(80)

1. 题目解析

题目链接:DP41 【模板】01背包

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

第一问:不超过总体积的背包问题

1. 状态表示

  • dp[i][j] 表示:从前 i 个物品中挑选,总体积不超过 j 的所有选法中,能挑选出来的最大价值。

2. 状态转移方程

  • 不选第 i 个物品:此时 dp[i][j] 等于从前 i-1 个物品中挑选,并且总体积不超过 j 的最大价值,即 dp[i][j] = dp[i - 1][j]
  • 选择第 i 个物品:需要确保选择该物品后总体积不超过 j,即 j >= v[i]。此时 dp[i][j] 等于从前 i-1 个物品中挑选,总体积不超过 j - v[i] 的最大价值加上第 i 个物品的价值,即 dp[i][j] = dp[i - 1][j - v[i]] + w[i]

综合两种情况,状态转移方程为:

3. 初始化

  • 为了简化边界条件,我们在数组顶部额外增加一行,并将这一行初始化为 0。因为不选择任何物品时,无论背包体积如何,价值都是 0。

4. 填表顺序

  • 根据状态转移方程,我们从上到下、从左到右填表即可。

5. 返回值

  • 最终返回 dp[n][V],即从 n 个物品中选择,总体积不超过 V 的最大价值。
第二问:正好总体积的背包问题

1. 状态表示

  • dp[i][j] 表示:从前 i 个物品中挑选,总体积正好等于 j 的所有选法中,能挑选出来的最大价值。

2. 状态转移方程

  • 类似地,我们有不选和选第 i 个物品两种情况。但这里需要注意的是,当选择第 i 个物品时,除了需要判断 j >= v[i],还需要确保 dp[i - 1][j - v[i]] 是有效的(即不是初始化的无效值)。

状态转移方程为:

3. 初始化

  • 同样,我们在数组顶部增加一行。第一行除了第一个元素(对应体积为 0 的情况)为 0 外,其余元素都设置为一个表示无效的初始值(如 -1)。

4. 填表顺序

  • 依然是从上到下、从左到右填表。

5. 返回值

  • 在返回最终答案前,需要判断 dp[n][V] 是否为初始值。如果是,则表示无法凑齐体积为 V 的背包;否则,返回 dp[n][V]

3.代码编写

#include <iostream>
#include <cstring>
using namespace std;const int N = 1010;
int n, V, v[N], w[N];
int dp[N][N];int main() {cin >> n >> V;for (int i = 1; i <= n; i++)cin >> v[i] >> w[i];//第一问for (int i = 1; i <= n; i++) {for (int j = 0; j <= V; j++) {//以i结尾不选idp[i][j] = dp[i - 1][j];if (j >= v[i]) { //剩余空间足够//在前i-1个取出背包剩余j-v[i]最大值,dp[i][j]就代表前i个剩余J时的最大值dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);}}}cout << dp[n][V] << endl;//第二问memset(dp, 0, sizeof dp);for (int j = 1; j <= V;j++) dp[0][j] = -1;//我们约定当前面凑不出刚好为j容量的物品是价值为-1,这里初始化表示取前0个物品,使得容量恰好为j,当j>0这不可能,所以初始化为-1for (int i = 1; i <= n; i++) {for (int j = 0; j <= V; j++) {//以i结尾不选idp[i][j] = dp[i - 1][j];if (j >= v[i] && dp[i - 1][j - v[i]] != -1) { //剩余空间足够//在前i-1个取出背包剩余j-v[i]最大值,dp[i][j]就代表前i个剩余J时的最大值dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);}}}cout << (dp[n][V] == -1 ? 0 : dp[n][V]) << endl;return 0;
}

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

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

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

相关文章

MOE学习笔记

MOE网络结构 和传统的 transformer 网络结构相比&#xff0c;我们将 Transformer 模型的每个 FFN 层替换为 MoE 层&#xff0c;MoE 层由门网络&#xff08;Router&#xff09;和一定数量的专家&#xff08;Expert&#xff09;组成。 这些 Expert 其实也是 FFN 层&#xff0c;…

探秘神经网络激活函数:Sigmoid、Tanh和ReLU,解析非线性激活函数的神奇之处

引言 在神经网络中&#xff0c;激活函数扮演着至关重要的角色。它们赋予神经网络非线性的能力&#xff0c;使得网络具备学习和表示复杂函数关系的能力。本文将详细解析三种常见的激活函数&#xff1a;Sigmoid、Tanh和ReLU&#xff0c;揭开它们在神经网络中的奥秘。无论你是初学…

5. Revit API: Application

5. Revit API: Application 前言 上一篇中&#xff0c;讲到了UI篇的Ribbon&#xff08;界面&#xff09;&#xff0c;并提到要创建 RibbonPanel&#xff0c;需要使用UIControlledApplication.CreateRibbonPanel(..)方法&#xff0c;还在结尾说到要写“UI”开头的那些个类&…

算法社区-从零开始构建(一)

好久没动笔了&#xff0c;一是要处理的东西很多&#xff0c;二则写出来未见得深刻&#xff0c;感觉沉淀得不够&#xff0c;太浅显的东西就没必要分享。 正好最近在研究算法层面的东西&#xff0c;感觉挺受用的&#xff0c;就想着把这些东西整理出来&#xff0c;有点像社区的雏形…

【例子】webpack配合babel实现 es6 语法转 es5 案例 [通俗易懂]

首先来说一下实现 es6 转 es5 的一个简单步骤 1、新建一个项目&#xff0c;并且在命令行中初始化项目 npm init -y2、安装对应版本的 webpack webpack-cli(命令行工具) "webpack""webpack-cli"3、安装 Babel 核心库和相关的 loader "babel-core&qu…

新质生产力潮水里:谁在为中小企业搭起一座桥?

与其说华为云为中小企业提供的是一个个更具性价比和产业适配度的产品&#xff0c;更本质来看&#xff0c;其通过618营销季为中小企业提供了一个数字化转型升级的契机&#xff0c;基于此&#xff0c;企业可以在云计算和AI时代实现内在变革&#xff0c;焕发新的生机与活力。 作者…

针对AIGC检测的鲁棒性测试——常见攻击手段汇总

前言&#xff1a;这篇文章来总结一下针对AIGC检测的常见攻击手段&#xff0c;选取的研究工作均出自近5年AIGC检测相关文章。&#xff08;论文被拒了需要补实验&#xff0c;先来看看别人怎么做的……&#xff09; 2019 WIFS Detecting and Simulating Artifacts in GAN Fake Ima…

泛微E9开发 根据判断条件,控制字段的编辑/必填属性

根据判断条件&#xff0c;控制字段的编辑/必填属性 1、需求说明2、实现方法3、扩展知识点1. 注册钩子事件&#xff0c;指定动作完成后触发1.1 接口名称及参数说明1.2 案例 2. 改变单个字段显示属性(只读/必填等)2.1 参数说明2.2 案例 1、需求说明 当字段“填报人”和字段“姓名…

vue3中ref标签

<tempalce><aa refa/> </tempalce> <script setup> import {ref} from vue //需要先定义一个空的ref let a ref() //然后才能使用组件ref的标签数据 </script> 然后需要在该组件中暴露出去 defineExpose({a,b,c})

ONLYOFFICE 桌面编辑器 8.1重磅来袭:全新功能提升您的办公效率

文章目录 前言ONLYOFFICE 桌面编辑器8.1一、PDF编辑&#xff1a;告别“头痛”时刻二、幻灯片版式&#xff1a;秒变“设计大师”三、无缝切换&#xff1a;办公界的“快速通道”四、语言支持&#xff1a;全球通吃的“翻译官”五、 隐藏“连接到云”板块&#xff1a;摆脱“云”的束…

Java NIO Buffer概念

针对每一种基本类型的 Buffer &#xff0c;NIO 又根据 Buffer 背后的数据存储内存不同分为了&#xff1a;HeapBuffer&#xff0c;DirectBuffer&#xff0c;MappedBuffer。 HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配&#xff0c;在堆中分配一个数组用来存放 Buffe…

73. UE5 RPG 优化投射物以及敌人生成

解决发射物会与地面产生交互的问题 之前一直遇到发射物的体积过大会在发射时&#xff0c;和地面产生交互&#xff0c;我们可以调整小一些&#xff0c;然后为了防止它和自身产生交互事件。我们可以实现它在生成后&#xff0c;不会触发相关事件&#xff0c;而是在一定时间后。 对…

k8s如何使用 HPA 实现自动扩展

使用Horizontal Pod Autoscaler (HPA) 实验目标&#xff1a; 学习如何使用 HPA 实现自动扩展。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 或内存的资源请求。创建一个 HPA&#xff0c;设置扩展策略。生成负载&#xff0c;观察 HPA 如何自动扩展 Pod…

Arduino称重传感器和 HX711 放大器(数字秤)

Arduino称重传感器和 HX711 放大器&#xff08;数字秤&#xff09; Arduino with Load Cell and HX711 Amplifier (Digital Scale) In this guide, you’ll learn how to create a digital scale with the Arduino using a load cell and the HX711 amplifier. First, you’l…

如何在微信小程序使用vant 进行自定义底部tabbar组件

在微信小程序中使用 Vant 自定义底部 TabBar 需要进行以下步骤&#xff1a; 一、首先&#xff0c;你需要在 app.json 文件中配置自定义 TabBar。 在 "tabBar" 字段中&#xff0c;设置 "custom" 为 true&#xff0c;表示使用自定义 TabBar。 app.json示例…

android 彩虹进度条自定义view实现

实现一个彩虹色进度条功能&#xff0c;不说明具体用途大家应该能猜到。想找别人造的轮子&#xff0c;但是没有合适的&#xff0c;所以决定自己实现一个。 相关知识 android 自定义view LinearGradient 线性渐变 实现步骤 自定义view 自定义一个TmcView类继承View 重写两…

【面试题】等保(等级保护)的工作流程

等保&#xff08;等级保护&#xff09;的工作流程主要包括以下几个步骤&#xff0c;以下将详细分点介绍&#xff1a; 系统定级&#xff1a; 确定定级对象&#xff1a;根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求&#xff0c;确定需要进行等级保护的…

x86 的 ebp 寄存器,可能比 cr3 更重要,好好掰扯一下 ebp

在 x86 架构的计算机中&#xff0c;ebp&#xff08;Extended Base Pointer&#xff09;寄存器通常用于指向当前函数的栈帧&#xff08;stack frame&#xff09;的基地址。栈帧是函数调用期间在栈上分配的一块内存区域&#xff0c;用于存储局部变量、函数参数、返回地址和其他临…

[FreeRTOS 功能应用] 信号量 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 信号量 概念 [FreeRTOS 内部实现] 信号量 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;信号量实战…

Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)

上次介绍了基础IO&#xff08;二&#xff09;&#xff1a;Linux&#xff1a;基础IO&#xff08;二.缓冲区、模拟一下缓冲区、详细讲解文件系统&#xff09; 文章目录 1.软硬链接1.1硬链接1.2软链接使用场景 2.动态库和静态库1.1回顾1.2静态库的制作和使用为什么要有库制作者角度…