动态规划(01背包恰好装满型详解):和为目标值的最长子序列长度

0-1背包:有n个物品,第i个物品的体积为w[i],价值为v[i],每个物品至多选择一个,求体积和不超过capacity的最大价值和。

对于第i个物品,我们只有两种选择:选,或者不选。如果选,那么背包的剩余容量减少w[i].如果不选,那么背包的剩余容量不变。

而问题实际上是:在剩余容量为c时,从前i个物品中得到的最大价值和为多少?

根据分析,我们可以进一步拆分这个问题。如果不选,那么子问题就为:在剩余容量为c时,从前i-1个物品中得到的最大价值和为多少?如果选,那么子问题就为:在剩余容量为c-w[i]时,从前i-1个物品中得到的最大价值和为多少?

显然可以用动态规划了。

第一步:确定dp数组的意思:dp[i][j]表示:从第0-i种物品中挑选,放进容量为j的背包里,得到的最大价值和。

第二步:初始化dp数组(对边界情况进行处理):当背包容量为0时,无法装下物品,因此价值为0,由此可令dp[i][0]==0;当选择物品的范围为0-0时,意味着我们只能选第一个物品,那么最大价值和只能为v[0],由此可令dp[0][i]==v[0].

第三步:填充。由上可知,要么选,要么不选。但是我们不能忘记选择权从何而来:背包的剩余容量大于等于物品体积。如果不是,那么直接不选。如果是,那么就根据前面的分析进一步处理。如果不选则dp[i][j]=dp[i-1][j].如果选,那么dp[i][j]=dp[i][j-w[i]]+v[i].选择二者中的最大值即可。

int backpack01(int kinds, int capacity, vector<int>& w, vector<int>& v)
{//kinds表示物品数量,capacity表示背包总容量,w[i]表示第i+1个物品的体积,v[i]表示第i+1个物品的价值vector<vector<int>>dp(kinds, vector<int>(capacity + 1, 0));//初始化://1.背包容量为0时,无法装下物品,最大价值和为0for (int i = 0; i < kinds; i++){dp[i][0] = 0;}//2.只有一种物品时,只能选择第一个物品,最大价值和为v[0]for (int i = 0; i <= capacity; i++){dp[0][i] = v[0];}//填充for (int i = 1; i < kinds; i++)//物品编号{for (int j = 1; j <= capacity; j++)//背包剩余容积{if (j < w[i]) dp[i][j] = dp[i - 1][j];//容不下当前物品,只能不选else{dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);}}}return dp[kinds - 1][capacity];
}

我们发现,dp[i][?]只与dp[i-1][?]有关,因此我们可以对空间复杂度进行优化,用一个一维数组dp滚动处理即可。

int backpack01(int kinds, int capacity, vector<int>& w, vector<int>& v)
{vector<int>dp(capacity + 1, 0);//dp[i]表示:背包容量为i时里面物品的最大价值和dp[0] = 0;//背包容量为0,装不下物品,最大价值和为0for (int i = 0; i < w.size(); i++)//外层循环:控制某一种物品{for (int j = capacity; j >= w[i]; j--)//内层循环:对于该种物品进行处理{dp[j] = max(dp[j], dp[j - w[i]] + v[i]);}}return dp[capacity];
}

关键点:j从capacity开始倒着处理。为什么要倒着处理?实际上,我们可以用“双数组”的理念去理解(双数组滚动也可以,只不过单数组空间复杂度更优,用双数组滚动更容易想象)。我们退化成两个数组,数组a用来保存上一轮的dp值,数组b用来填充接下来的dp值。前面我们说过,dp[i][x]实际上只由dp[i-1][x]决定,所以填充b只需要依赖a中的值。但也正因如此,我们在填充b的时候,就不能改变a中的值了。我们现在只有一个数组,如果我们从前往后处理,那么相当于:我们在填充b中dp值时,它所依赖的a中的dp值已经被改变了。所以我们需要从后往前处理,因为填充依赖前面的原始数据。两个关键词:前面的+原始。

同时我们还进行了一点优化:j>=w[i].这意味着我们不需要再判断当前背包的容量是否能够装下物品了,因为这时候物品已经定下来了(外层循环控制)。所以小于w[i]的j必然都装不下,就不用处理了。

看一道具体的题目:

2915. 和为目标值的最长子序列的长度 - 力扣(LeetCode)

本题中:下标相当于物品编号,下标对应的值相当于物品的体积,target相当于背包的容量,长度相当于价值。

int lengthOfLongestSubsequence(vector<int>& nums, int target)
{if (accumulate(nums.begin(), nums.end(), 0) < target) return -1;int kinds = nums.size(), capacity = target;vector<int>dp(capacity + 1, -1);dp[0] = 0;for (int i = 0; i < kinds; i++){for (int j = capacity; j >= nums[i]; j--){if (dp[j - nums[i]] != -1)//注意这里{dp[j] = max(dp[j], dp[j - nums[i]] + 1);}}}return dp[capacity];
}

为什么需要判断dp[j-nums[i]]是否等于-1?

我们先来想想等于-1意味着什么。dp[j-nums[i]]==-1意味着:在考虑前i个元素时,无法组成和为j-nums[i]的子序列。而只有当存在j-nums[i]的子序列时,我们才能通过添加当前元素nums[i]来得到和为j的子序列。

因此,如果dp[j-nums[i]]等于-1,那意味着没有基础来构建dp[j],所以不能更新。

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

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

相关文章

Spring漏洞再现

一、CVE-2017-8046 1、开环境 2、访问目录 /customers/1 3、在当前页抓包&#xff0c;并修改数据包 PATCH /customers/1 HTTP/1.1 Host: 150.158.199.164:8080 Accept-Encoding: gzip, deflate Accept: */* User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;…

Ftrans飞驰云联受邀参加“2025汽车零部件CIO年会“并荣获智象奖

2025年3月6日&#xff0c;由栖观汽车、栖观资讯和飞羽商务主办的“2025第二届中国汽车&零部件CIO年会暨智象奖颁奖盛典”于上海盛大召开&#xff0c;Ftrans飞驰云联作为国内领先的企业文件传输与数据交换解决方案提供商&#xff0c;受邀出席了年会&#xff0c;并凭借卓越的…

西门子 CPU 1513-1 PN TCP Server 接收字符串前多了一个问号

TIA V17编程环境中(CPU 1513-1 PN),调用TSEND_C以TCP协议向TCP Server发送字符串:abded1234,TCP Server接收到的字符串多了一个问号:?avded1234. TSEND_C 指令的 DATA DB为非优化string类型数据 截图如下: 字符串前面两个字节不是起始字符,第一个是字节是字符串最大长度…

Matlab2024a免费版下载教程

Matlab是一个高性能的数学计算与仿真软件&#xff0c;广泛应用于科学计算、数据分析、算法开发以及工程绘图等多个领域。它提供了强大的矩阵运算能力、丰富的内置函数库以及灵活的编程环境&#xff0c;使得用户能够高效地解决复杂的数学问题。本文&#xff0c;我将为大家详细介…

SpringCould微服务架构之Docker(1)

项目中微服务比较多的时候&#xff0c;一个一个手动的部署太麻烦了&#xff0c;所以就需要用到Docker。 项目部署中的问题&#xff1a; Docker是一种快速交付应用、运行应用的技术。

软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡

软件公司高新技术企业代办&#xff1a;机遇与陷阱并存-优雅草卓伊凡 在科技飞速发展的当下&#xff0c;软件公司如雨后春笋般涌现&#xff0c;众多企业渴望通过申请高新技术企业来获得政策支持与发展助力。随之而来的&#xff0c;是高新技术企业代办业务的兴起。然而&#xff…

动捕技术革新虚拟直播:解码虚拟主播的“拟真感“破局之路

在元宇宙技术加速落地的今天&#xff0c;虚拟直播已从早期的卡通形象展示&#xff0c;进化为具备情感交互的沉浸式体验&#xff0c;用户对"高拟真度互动"的需求也逐渐增加&#xff0c;这场行业变革的核心驱动力&#xff0c;离不开动捕技术的持续迭代。 虚拟直播的&q…

python字节码文件.pyc反编译成.py文件

一、前言 在 Python 开发过程中&#xff0c;.pyc 文件&#xff08;Python 字节码文件&#xff09;是 Python 解释器运行程序时生成的一种中间文件。它通常用于提高程序的运行效率&#xff0c;避免每次运行时都重新编译源代码。然而&#xff0c;由于各种原因&#xff0c;我们可…

C++友元:跨墙访问的三种姿势

目录 友元 友元之普通函数形式 友元之成员函数形式 友元类 友元的特点 友元 什么叫友元&#xff1f; 一般来说&#xff0c;类的私有成员只能在类的内部访问&#xff0c;类之外是不能访问它们的。但如果将其他类/函数设置为类的友元&#xff0c;那么友元类/函数就可以在前…

Typora安装使用教程 简单易用的Markdown编辑器

Typora markdown 编辑器下&#xff0c;最后一个免费版本 0.11.18&#xff0c;但可能会提示过期无法使用, 建议大家可以使用 0.9.96 Windows 版&#xff0c;下载 Windows X64 版。 Typora简介 Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器&#xff0c;与其他 Mark…

图解AUTOSAR_SWS_WatchdogInterface

AUTOSAR Watchdog Interface (WdgIf) 详解 AUTOSAR经典平台看门狗接口模块技术详解 目录 1. 概述 1.1 WdgIf模块的作用1.2 WdgIf在AUTOSAR中的位置2. 架构设计 2.1 WdgIf架构概览2.2 接口设计2.3 序列设计3. 配置详解 3.1 配置参数3.2 配置结构3.3 配置类型4. 总结 4.1 主要特点…

(Arxiv-2025)Magic 1-For-1:在一分钟内生成一分钟视频剪辑

Magic 1-For-1&#xff1a;在一分钟内生成一分钟视频剪辑 paper是PKU发布在Arxiv 2025的工作 paper title:Magic 1-For-1: Generating One Minute Video Clips within One Minute Code&#xff1a;地址 Abstract 在本技术报告中&#xff0c;我们提出了 Magic 1-For-1&#xff…

谷歌大型推理模型曝光!击败Claude-3.7-Thinking

哎&#xff01;最近推特上的网友在LMSYS Arena 发现了个泄漏的大模型 Nebula&#xff0c;效果据说特别好&#xff0c;打败了o1、o3-mini、Claude 3.7 Thinking等模型&#xff1a; 网友们通过询问和分析 API&#xff0c;发现这似乎是谷歌正在秘密测试的新推理模型&#xff01;推…

css-grid布局

文章目录 1、布局2、网格轨道3、间距Gap4、网格线5、网格别名 当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后&#xff0c;它就变成了一个网格容器&#xff0c;这个元素的所有直系子元素将成为网格元素。 1、布局 启用grid布局类似与flex布局&#xff0c;不过g…

菱形虚拟继承的原理

一 &#xff1a;菱形继承的问题 普通的菱形继承存在数据冗余和二义性的问题 &#xff0c;如下代码&#xff1a; class Person { public:string _name; //姓名 };class Student : public Person { protected:int _num; //学号 };class Teacher : public Person { protected:int…

<数据集>轨道异物识别数据集<目标检测>

数据集下载链接&#xff1a;https://download.csdn.net/download/qq_53332949/90527370 数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1659张 标注数量(xml文件个数)&#xff1a;1659 标注数量(txt文件个数)&#xff1a;1659 标注类别数&#xff1a;6 标注类别…

高效PDF翻译解决方案:多引擎支持+格式零丢失

软件介绍 在AI翻译工具大行其道的今天&#xff0c;传统翻译软件市场逐渐饱和&#xff0c;但专业领域的深度需求依然存在。本文推荐的PDF翻译工具凭借20余种专业翻译接口&#xff0c;为学术文献、技术文档等复杂内容提供更精准的翻译服务&#xff0c;在保留文档原始排版的同时…

AI智能新标尺:诺姆·布朗谈token成本革命

第一章&#xff1a;从德州扑克到AI革命——诺姆布朗的“顿悟时刻” 1.1 从“人机对战”到“思维革命” 诺姆布朗的AI研究生涯始于2012年卡内基梅隆大学的实验室。彼时&#xff0c;国际象棋AI“深蓝”已横扫棋坛&#xff0c;围棋AI“AlphaGo”初露锋芒&#xff0c;但非完美信息…

碰一碰发视频系统开发者源码分析(一)

#碰一碰发视频系统# #碰一碰发视频saas系统#搭建 碰一碰发视频&#xff0c;是采用前沿技术搭载一套 AI 智能剪辑系统“碰一碰发视频”是一种基于近场通信&#xff08;NFC&#xff09;或蓝牙技术的创新交互方式&#xff0c;用户通过设备轻触即可触发视频传输或播放。本文将详细…

ROS2下MoveIt+Rviz+MuJoCo 三剑合璧!Panda 机械臂联动仿真!

视频讲解&#xff1a; ROS2下MoveItRvizMuJoCo 三剑合璧&#xff01;Panda 机械臂联动仿真&#xff01; 仓库代码&#xff1a;GitHub - LitchiCheng/ros2_package 今天介绍下&#xff0c;ros2下使用moveit在Rviz和mujoco联合仿真&#xff0c;结合上一期视频《MuJoCo 仿真 Pand…