背包九讲——二维费用背包问题
目录
二维费用背包问题
问题描述:
解决方法:
方法一:
代码实现:
方法二:
代码实现:
背包问题第五讲——二维费用背包问题
背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。问题的一般描述是:有一个背包,其容量为C;有一组物品,每个物品有重量w和价值v。目标是选择一些物品放入背包,使得它们的总重量不超过背包容量,同时总价值最大。
二维费用背包问题则是背包问题的变体,在背包问题中它只限定物品的重量,二维费用背包会再限定一个维度(体积),在既满足背包容量和既满足背包体积的情况下,使价值最大化。

二维费用背包问题
二维费用背包问题是一种组合优化问题,它是经典的背包问题的扩展。在这个问题中,每件物品具有两个不同的属性,通常被称为“费用”或“资源限制”,以及一个价值。问题的目标是在给定的两种资源限制下,选择一组物品,使得它们的总价值最大。
二维费用背包呢,博主觉得是二重01背包的进化体,之前我们讨论的都是只有一个限定背包容量,比如在背包容量为V所能获得的价值,现在二维费用背包就是又加上了重量(第二维),比如背包容量为V且背包重量不能超过为M所能获得的价值。

问题描述:
- 有一组物品,每件物品都有一个重量(或体积)w[i]和价值v[i]。
- 有两种资源的限制,分别用W和U表示,对应于背包的承重和空间限制。
- 每件物品除了有一个重量w[i],还有一个额外的属性u[i],表示它占用的第二种资源的量。
- 背包可以选择装入或者不装入每件物品,但每件物品只能选择一次。
- 问题的目标是确定应该选择哪些物品,以便在不超过背包的重量W和第二种资源限制U的情况下,使得背包中物品的总价值最大。
题目可以参考一下这个:8. 二维费用的背包问题 - AcWing题库
题目描述基本跟01背包没有什么区别,无非就是多了一个限定条件,我们要在满足此两个条件的基础上去求最大价值。01背包问题之前dp只是定义了一个维度解决一个限定条件的问题,那么我们可以再去扩展一维,那么就可以解决两个限定条件了,我们会发现,这样的动态规划们还可以优化一个维度,这两个方法分别对应下面两个方法。
解决方法:
方法一:
数学上,我们可以使用动态规划来解决这个问题。由于我们是二维的背包,那么定义一个三维数组dp[i][j][k],其中i表示考虑到第i件物品,j表示当前背包的重量不超过j,k表示当前背包的第二种资源不超过k。dp[i][j][k]的值表示在这些条件下的最大价值。
状态转移方程如下:
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-w[i]][k-u[i]] + v[i]) if j >= w[i] && k >= u[i]
其中,dp[i-1][j][k]表示不选择第i件物品时的最大价值,而dp[i-1][j-w[i]][k-u[i]] + v[i]表示选择第i件物品时的最大价值。
最终,问题的解是dp[N][W][U],其中N是物品的总数。

代码实现:
// 遍历所有物品for (int i = 1; i <= n; i++) {for (int j = 0; j <= W; j++) {for (int k = 0; k <= U; k++) {if (j >= weights[i - 1] && k >= volumes[i - 1]) {// 状态转移方程:选或不选第i件物品dp[i][j][k] = max(dp[i - 1][j][k], dp[i - 1][j - weights[i - 1]][k - volumes[i - 1]] + values[i - 1]);} else {// 如果背包无法容纳当前物品,则不选择该物品dp[i][j][k] = dp[i - 1][j][k];}}}}// 返回背包能够容纳的最大价值return dp[n][W][U];
方法二:
根据上面的代码,我们可以看出来第一个for循环是有生存周期的,第i个状态只与第i-1个状态有关,所有的第i个状态都是从第i-1个状态转移过来的,与前i-2个状态无关,那么我们可以利用这一点,去滚动数组,此时第i个状态更新便可以从前面的状态转移过来,从而覆盖掉上一个状态的答案,以此类推。这样我们便可以优化掉第一维度,减少了空间复杂度。其实二维费用背包没有什么特别说的,就是01背包的推广,所谓道生一,一生二,二生三,三生万物。既然有二维费用背包,那是不是就有三维、四维……,那么我们可以根据01背包的写法进行改进。

代码实现:
#include<iostream>
using namespace std;
int N,V,M;
int v[1005],m[1005],w[1005],dp[1005][1005];
//dp[i][j]表示体积为i重量为j的情况下所获得最大价值
int main(){cin>>N>>V>>M;//N个物品V背包体积M背包所承受最大重量for(int i=1;i<=N;i++){cin>>v[i]>>m[i]>>w[i];for(int j=V;j>=v[i];j--){for(int k=M;k>=m[i];k--){//这里按照01背包一维优化分两个for来写dp[j][k]=max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);//要么选第i个物品要么就不选}}}cout<<dp[V][M]<<endl;return 0;
}
上一篇文章:背包九讲——混合背包问题-CSDN博客
背包问题是经典之经典,每一位算法入门学者必学的内容,里面的优化涉及到的也非常具有思维性,值得大家好好学习。由于笔者水平有限,一些方面可能也存在着问题,望大家理解支持,有错误就指出改正,大家一起进步,执笔至此,感触彼多,全文将至,落笔为终,感谢各位的支持,下篇更新分组背包问题。
相关文章:
背包九讲——二维费用背包问题
目录 二维费用背包问题 问题描述: 解决方法: 方法一: 代码实现: 方法二: 代码实现: 背包问题第五讲——二维费用背包问题 背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中…...
【mysql进阶】4-7. 通用表空间
通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性? ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据,与系统表空间类似也是共享表空间; 服务器运⾏时会把表空间元数…...
2024 年互联网大厂 1300 多道 JAVA 面试题汇总,包含了程序员的所有技术点
作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万,而…...
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
Linux资源与网络请求
参数说明: d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行c : 切换显示模式,共有两种模式&#…...
RPA技术重塑企业自动化的未来
1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化(Robotic Process Automation,简称RPA)是一种软件技术,通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…...
使用RabbitMQ实现延迟消息的完整指南
在分布式系统中,消息队列通常用于解耦服务,RabbitMQ是一个广泛使用的消息队列服务。延迟消息(也称为延时队列或TTL消息)是一种常见的场景应用,特别适合处理某些任务在一段时间后执行的需求,如订单超时处理、…...
阿里员工:阿里工作7年至少得P7吧,快的都P8了,年薪100W是正常的,80才算及格...
上一篇:一线体面男的收入 年薪64W的阿里蚂蚁员工爆料:在阿里,工作7年至少得P7,快的都P8了,年薪100W才正常,80分才算及格。 其实,在大厂工作,听起来风光无限,但个中滋味&a…...
Django进一步掌握(10月22日)
一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 (1)使用Ht…...
C++从入门到起飞之——红黑树封装map和set 全方位剖析!
目录 1、map和set的整体框架 2、map和set迭代器的实现 3、map支持[] 4、完整源码 set.h map.h RBTree.h 1、map和set的整体框架 因为map和set的底层都是红黑树,所以我们考虑用一个红黑树的类模版去实例化map和set对象!不过,map节点中存…...
【javax maven项目缺少_Maven的依赖管理 引入依赖】
javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…...
手搓一个定时器
目录 1.什么是定时器 2.计时器的使用 3.手搓定时器 3.1定义一个TimerTask类 3.2定义一个Timer类 3.3实现schedule方法 3.4实现Timer的构造方法 3.4.1随时随地查看优先级队列中是否有任务要执行 3.4.2获取队首任务,并判断是否到执行时间 3.4.3到达执行时间…...
AI提示词工程优化Prompt-GPT使用手册(科普一键收藏史上最强攻略)
Prompt(提示),最初是 NLP 研究者为下游任务设计出来的一种任务专属的输入形式或模板。在 ChatGPT 引发大语言模型新时代之后,Prompt 指与大模型交互输入的代称。 随着大模型的进展,Prompt Engineering是一个持久的探索过程。 目录 什么是提示…...
【数据结构】快速排序(三种实现方式)
目录 一、基本思想 二、动图演示(hoare版) 三、思路分析(图文) 四、代码实现(hoare版) 五、易错提醒 六、相遇场景分析 6.1 ❥ 相遇位置一定比key要小的原因 6.2 ❥ 右边为key,左边先走 …...
利用前向勾子获取神经网络中间层的输出并将其进行保存(示例详解)
代码示例: # 激活字典,用于保存每次的中间特征 activation {}# 将 forward_hook 函数定义在 upsample_v2 外部 def forward_hook(name):def hook(module, input, output):activation[name] output.detach()return hookdef upsample_v2(in_channels, o…...
CTF-RE 从0到N: S盒
S盒(Substitution Box) 是密码学中的一种替换表,用于对输入数据进行非线性变换,以增加加密过程的复杂性。它主要用于对称加密算法中(例如AES、DES),作为加密轮次的一部分,对输入字节…...
MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。
2024-10-10,由电信研究所、里斯本大学等联合创建MT-Pref数据集,它包含18种语言方向的18k实例,覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验,我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…...
【C++ 真题】B2099 矩阵交换行
矩阵交换行 题目描述 给定一个 5 5 5 \times 5 55 的矩阵(数学上,一个 r c r \times c rc 的矩阵是一个由 r r r 行 c c c 列元素排列成的矩形阵列),将第 n n n 行和第 m m m 行交换,输出交换后的结果。 输入格式 输入共 6 6 6 …...
AAPL: Adding Attributes to Prompt Learning for Vision-Language Models
文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示, π \pi π在类聚类方面没有显示出很大的差异,这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后,如图(b)所示,效果也是如…...
MySQLDBA修炼之道-开发篇(一)
三、开发基础 1. 数据模型 1.1 关系数据模型介绍 关于NULL 如果某个字段的值是未知的或未定义的,数据库会提供一个特殊的值NULL来表示。NULL值很特殊,在关系数据库中应该小心处理。例如查询语句“select*from employee where 绩效得分<85 or>绩…...
计算对方预测位置与本方偏差
航天器交会 分布式MPC在近地轨道上实现两个航天器的精准交会,就像让两枚子弹在千米外相撞——不仅要算准弹道,还要实时应对各种扰动。传统集中式控制需要把所有计算放在地面站,延迟和通讯瓶颈让人头秃。这时候分布式模型预测控制(…...
个人健康助手:OpenClaw+nanobot分析智能手环数据
个人健康助手:OpenClawnanobot分析智能手环数据 1. 为什么需要自动化健康数据分析 作为一个长期伏案工作的程序员,我的抽屉里躺着三款不同品牌的智能手环。它们记录了我每天的步数、心率、睡眠周期等数据,但每次打开厂商APP查看那些五彩斑斓…...
PPPOSClient:ESP32上轻量级GSM PPP over Serial客户端实现
1. PPPOSClient 库深度解析:面向 ESP32 的 GSM PPPoS 协议客户端实现1.1 库定位与工程价值PPPOSClient 是一个专为嵌入式物联网终端设计的轻量级 GSM 网络接入中间件,其核心价值在于将底层 PPP over Serial(PPPoS)协议栈与上层应用…...
技术经理必修管理知识:从管理到领导——高阶技术管理者的自我修养
08-技术经理必修管理知识:从管理到领导——高阶技术管理者的自我修养管理者正确地做事,领导者做正确的事。管理的终点是效率,领导的起点是方向。当你开始思考"我们该往哪里走"而不是"我们该怎么走快一点",你就…...
OpenClaw:以智能之力重塑效率,轻量化进阶之路与国产创新展望
各位深耕AI领域的打工人、极客与企业管理者:2026年的春天,OpenClaw(被全球用户亲切称为“小龙虾”)早已成为科技圈的核心焦点,若你尚未接触这只席卷全球的开源AI Agent(智能体)框架,…...
开源项目依赖管理:从冲突解决到高效协作的实践指南
开源项目依赖管理:从冲突解决到高效协作的实践指南 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a corp…...
认知雷达前沿技术 从认知到量子:雷达技术的跨范式融合
目录 二、知识图谱解析 关键概念关联说明 三、章节结构层级 四、概念关联与技术成熟度分析 五、核心学术观点提炼 六、关键术语中英对照表 本章探讨了认知雷达(Cognitive Radar)与量子雷达(Quantum Radar)的融合路径,构建了一个从生物启发到量子极限的雷达技术演进框架。…...
FPGA DSP48E2实战避坑:为什么你的32x32定点乘法性能上不去?从原理到优化全解析
FPGA DSP48E2实战避坑:为什么你的32x32定点乘法性能上不去?从原理到优化全解析 在FPGA信号处理系统设计中,32x32定点乘法器是构建数字滤波器、FFT核心和矩阵运算的基础模块。许多工程师在使用Xilinx UltraScale系列FPGA的DSP48E2 Slice时&…...
优化问题存储格式对比:CBF vs MPS vs LP,哪种更适合你的场景?
优化问题存储格式深度对比:CBF、MPS与LP的技术选型指南 1. 优化问题存储格式的核心价值 在数学优化领域,数据存储格式的选择往往决定了工作流的效率和可扩展性。当处理包含混合整数变量、锥约束或大规模稀疏矩阵的复杂优化问题时,一个设计良好…...
如何使用 Flutter 开发 HarmonyOS 应用
文章目录为什么使用 Flutter 来开发?搭建 Flutter 开发环境mac 环境变量示例win 环境变量参考验证环境变量是否配置成功集成与调试 Flutter OH SDKFlutter 开发环境搭建第一个 Flutter OH 程序其它常用 Flutter OH 命令题外话Flutter OH 参考文档Author:…...
