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

news2024/9/20 9:26:44

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结尾不选i
            dp[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这不可能,所以初始化为-1
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= V; j++) {
            //以i结尾不选i
            dp[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.coloradmin.cn/o/1858503.html

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

相关文章

android adb常用命令集

1、系统调试 #adb shell&#xff1a;进入设备的 shell 命令行界面&#xff0c;可以在此执行各种 Linux 命令和特定的 Android 命令。 #adb shell dumpsys&#xff1a;提供关于系统服务和其状态的详细信息。 #adb logcat&#xff1a;实时查看设备的日志信息。可以使用过滤条件来…

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…

二叉树-左叶子之和(easy)

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 此题属于树遍历的简单题&#xff0c;用递归深度遍历的方式&#xff0c;当遇到左叶子结点(在递归函数中加上一个判断当前结点是左结点还是右结点的标记位)&#xff0c;此时加上当前结点…

ONLYOFFICE 桌面编辑器 8.1:全新升级,助您轻松高效处理办公文档

ONLYOFFICE 桌面编辑器 一、前言二、轻松编辑器 PDF 文件三、用幻灯片版式快速修改幻灯片四、无缝切换文档编辑、审阅和查看模式五、改进从右至左语言的支持 & 新的本地化选项六、版本 8.1&#xff1a;其他新功能七、ONLYOFFICE 官网&#xff1a;https://www.onlyoffice.co…

OnlyOffice8.1新功能测评

一、导语 时隔四个月&#xff0c;OnlyOffice推出了8.1版本。 四个月过去&#xff0c;笔者的项目也接近尾声&#xff0c;在项目过程中还把OnlyOffice插件推荐给了项目组&#xff0c;希望官方多出好用功能&#xff0c;造福我们广大项目O(∩_∩)O 回归正题&#xff0c;与前几个…

【数据结构与算法】之(数据结构绪论篇)(一)溢彩色

总而言之&#xff1a;《数据结构》是介于数学、计算机硬件和计算机软件三者之间的一门核心课程 1-1.抽象数据类型&#xff1a; 一个数学模型及定义在该模型上的一组操作&#xff1b;抽象数据类型体现了程序设计中问题分解&#xff0c;抽象和信息隐藏的特性。 抽象&#xff1a…

最新《pvz植物大战僵尸杂交版》整合安装包,全面支持Android、ios、Windows,附教程!

今天&#xff0c;阿星要聊聊最近全网大火的一款老游戏——《植物大战僵尸》杂交版。 虽然它不是什么3A大作&#xff0c;但在阿星的心里&#xff0c;它永远是那个让人回味无穷的经典。记得十年前&#xff0c;阿星和大多数玩家一样&#xff0c;玩的都是盗版。那时候的《植物大战…

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…

路由器ARP和ARP-proxy(华为)

#交换设备 路由器ARP和ARP-proxy(华为) 当一个广播域中的主机想要访问另外一个广播域的主机时&#xff0c;会广播ARP报文&#xff0c;询问目标IP地址所对应的MAC地址&#xff0c;默认情况下&#xff0c;arp记录是设备自动生成的&#xff0c;但是这样会容易受到ARP欺骗攻击&am…

系统架构设计师 - 数据库系统(2)

数据库系统 数据库系统规范化理论 ★ ★ ★ ★ ★函数依赖求候选键Armstrong公理范式判断第一范式 1NF第二范式 2NF第三范式 3NFBC 范式 BCNF 模式分解保持函数依赖分解无损分解 并发控制 ★事务的 ACID 特性并发存在的问题并发解决方案 - 封锁协议 数据库的安全性 ★安全性的分…

C++多线程异步日志实现

使用C11标准&#xff0c;构建了一个方便使用的、轻量化的日志系统。封装线程安全的lockQueue&#xff0c;实现对每条日志添加信息、push到lockQueue中的LogTmp类&#xff0c;实现一个多线程异步的日志系统Logger。 lockqueue.h #pragma once #include <queue> #include…

pdf转图片转换器,pdf转图片的工具

在日常的工作和学习中&#xff0c;我们经常会遇到需要将PDF文件转换为图片格式的情况。那么&#xff0c;如何才能将PDF格式转换为图片格式呢&#xff1f;今天&#xff0c;我将为大家介绍几种简单易用的方法&#xff0c;帮助大家轻松实现PDF转图片。 打开“轻云pdf处理官网网站”…

Linux 动态监控系统

top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处&#xff0c;在于top在执行一段时间可以更新正在运行的的进程。 一、基本指令 top top -d&#xff1a; 秒数 :每隔设定值秒数更新&#xff0c;未设置下默认为3秒 top -i:使top不显示任何闲置或者僵死进…

行人重识别Reid(可实现人员换装情况下的人员检索)

本项目的行人重识别是出自论文"Beyond Scalar Neuron: Adopting Vector-Neuron Capsules for Long-Term Person Re-Identification",该文章所涉及到的相关理论在我另外一篇文章中有讲解&#xff1a;Reid系列论文学习——换装Reid&#xff0c;不过经过本人测试&#x…

高清录屏软件哪个好用?分享这3款录屏软件

在我们的日常生活和工作中&#xff0c;视频录制是我们经常需要使用到的功能。不仅可以帮助我们录制网课内容方便后期复习&#xff0c;还可以录制视频会议&#xff0c;记录上级指示&#xff0c;甚至可以通过录制一些视频教程或游戏视频上传网络进行分享。 对电脑屏幕进行录制&a…

postman教程-22-Newman结合Jenkins执行自动化测试

上一小节我们学习了Postman Newman运行集合生成测试报告的方法&#xff0c;本小节我们讲解一下Postman Newman结合Jenkins执行自动化测试的方法。 在软件开发过程中&#xff0c;持续集成&#xff08;CI&#xff09;是一种实践&#xff0c;旨在通过自动化的测试和构建过程来频繁…

QThread 与QObject::moveToThread利用Qt事件循环在子线程执行多个函数

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

使用插件和微调优化 GPT 模型

文章目录 LLM 用例和示例产品警惕 AI 幻觉&#xff1a;限制与考虑使⽤插件和微调优化 GPT 模型 OpenAI 在其网站上展示了许多激励人心的客户故事&#xff0c;我们需要了解这些模型如何改变我们的社会并为商业和创造力开辟新机遇。正如你将看到的&#xff0c;许多企业已经开始使…

【kaggle数据集无法下载解决办法】

kaggle数据集无法下载的解决办法 当我们在做机器学习相关问题的时候&#xff0c;需要到kaggle网站上下载数据集&#xff0c;但是很多时候速度很慢或者连接超时等问题&#xff0c;此时解决办法如下&#xff1a; 在本地安装Kaggle API包 打开终端输入如下指令&#xff1a; pip i…

ONLYOFFICE8.1-------宝藏级别桌面编辑器测评

简介 ONLYOFFICE 8.1 是一个功能强大的办公套件&#xff0c;提供了一系列广泛的功能&#xff0c;用于文档管理、协作和沟通。它包括用于创建和编辑文本文档、电子表格、演示文稿等的工具。ONLYOFFICE 8.1 的一些关键特性包括&#xff1a; 1. 协作&#xff1a;ONLYOFFICE 8.1 …