二维费用01背包
P1855 榨取kkksc03 题解复盘模块动态规划目标在金钱和时间都有限的情况下最多完成多少个愿望基本信息项目内容题目编号、来源P1855 洛谷 / 榨取kkksc03训练层级B 变形题知识版块二维费用背包、01背包、动态规划解题前 · 关键信号识别维度分析目标、约束、底层结构目标在总金钱不超过M、总时间不超过T的情况下尽可能完成更多愿望。约束每个愿望只能完成一次。底层结构每个物品有两个费用限制金钱、时间属于二维费用 01 背包。数据规模n≤100M,T≤200使用O(nMT)可以通过。候选算法和依据算法二维费用 01 背包。依据每个愿望只能选择一次同时消耗两种资源因此需要用二维状态记录金钱和时间。复杂度预判时间复杂度O(n×M×T)空间复杂度O(M×T)。解题后 · 外化复盘维度内容实现结构 / 核心思路定义dp[j][k]表示使用不超过j元钱和k分钟时间时最多可以完成的愿望数。枚举每个愿望再分别倒序枚举金钱和时间使用dp[j][k]max(dp[j][k],dp[j-m][k-t]1)更新答案。错因回溯1. 容易把二维费用背包误写成一维背包只记录一种资源。2. 容易把金钱或时间正序枚举导致同一个愿望在同一轮被重复选择。3. 输入愿望数量时应枚举n不能误写成M或T。边界和易错点1. 每个愿望只能完成一次因此两个容量都必须倒序枚举。2.dp初始值默认为 0 即可因为什么都不选时完成愿望数为 0。3. 最终答案是dp[M][T]。下次看到什么信号我应该想到这个方法看到“每件物品只能选一次 有两个容量限制 求最大价值/最多数量”想到二维费用 01 背包。AC 完整代码#includeiostream#includequeue#includealgorithm#includevector#includeiomanipusingnamespacestd;structnode{intm,t;};intdp[205][205];intmain(){intn,M,T;cinnMT;node v[105];for(inti1;in;i){cinv[i].mv[i].t;}for(inti1;in;i){for(intjM;jv[i].m;j--){for(intkT;kv[i].t;k--){dp[j][k]max(dp[j][k],dp[j-v[i].m][k-v[i].t]1);}}}coutdp[M][T];return0;}本题知识点总结1. 状态定义dp[j][k]表示在金钱不超过j、时间不超过k的情况下最多可以完成多少个愿望。普通 01 背包只有一个容量dp[j]这题有两个限制金钱 时间所以状态增加一维dp[j][k]2. 状态转移对于当前愿望需要金钱m 需要时间t如果选择它dp[j-m][k-t]1如果不选择dp[j][k]因此dp[j][k]max(dp[j][k],dp[j-m][k-t]1);3. 为什么两个容量都倒序因为每个愿望只能完成一次。如果金钱或时间正序枚举本轮刚刚更新出的状态可能继续参与后面的转移相当于同一个愿望被重复使用。因此必须for(intjM;jm;j--){for(intkT;kt;k--){...}}4. 与普通01背包对比普通 01 背包一个容量限制状态dp[j]转移dp[j]max(dp[j],dp[j-w]v);二维费用背包两个容量限制状态dp[j][k]转移dp[j][k]max(dp[j][k],dp[j-w1][k-w2]value);5. 为什么这题价值是 1因为每完成一个愿望答案增加一个。所以dp[j-v[i].m][k-v[i].t]1这里的1就是再完成当前这个愿望。如果题目改成每个愿望还有一个价值w[i]那就会变成dp[j][k]max(dp[j][k],dp[j-m][k-t]w[i]);模型对比模型资源限制每件物品次数状态01背包1种一次dp[j]完全背包1种无限次dp[j]二维费用01背包2种一次dp[j][k]一句话总结看到“两个容量限制 每件物品只能选一次”想到二维费用 01 背包定义dp[j][k]两个容量全部倒序枚举。P1507 NASA的食物计划 题解复盘模块动态规划目标在体积和质量都有限的情况下选择若干食品使总卡路里最大基本信息项目内容题目编号、来源P1507 洛谷 / NASA的食物计划训练层级B 变形题知识版块二维费用背包、01背包、动态规划解题前 · 关键信号识别维度分析目标、约束、底层结构目标在总体积不超过H、总质量不超过T的情况下使所选食品的总卡路里最大。约束每个食品只能选择一次。底层结构每件物品同时消耗体积和质量两种资源因此属于二维费用 01 背包。数据规模H,T≤400n≤50使用O(nHT)可以通过。候选算法和依据算法二维费用 01 背包。依据每件食品只能选择一次并且有体积、质量两个容量限制。复杂度预判时间复杂度O(n×H×T)空间复杂度O(H×T)。解题后 · 外化复盘维度内容实现结构 / 核心思路定义dp[j][k]表示在体积不超过j、质量不超过k的情况下能够获得的最大卡路里。枚举每件食品再倒序枚举体积和质量使用dp[j][k]max(dp[j][k],dp[j-h][k-t]x)更新答案。错因回溯1. 容易把二维费用背包写成普通一维 01 背包漏掉质量或体积其中一个限制。2. 如果体积或质量正序枚举会导致同一件食品在同一轮被重复选择。3. 容易把第三个属性卡路里误当成容量而实际上它是价值。边界和易错点1. 每件食品只能使用一次因此两个容量都必须倒序。2.dp初始值为 0 即可因为可以什么都不选。3. 最终答案是dp[H][T]。下次看到什么信号我应该想到这个方法看到“每件物品只能选一次 有两个容量限制 求最大价值”想到二维费用 01 背包。AC 完整代码#includeiostream#includequeue#includealgorithm#includevector#includeiomanipusingnamespacestd;structnode{inth,t,x;};intdp[405][405];intmain(){intH,T,n;cinHTn;node v[55];for(inti1;in;i){cinv[i].hv[i].tv[i].x;}for(inti1;in;i){for(intjH;jv[i].h;j--){for(intkT;kv[i].t;k--){dp[j][k]max(dp[j][k],dp[j-v[i].h][k-v[i].t]v[i].x);}}}coutdp[H][T];return0;}本题知识点总结1. 状态定义dp[j][k]表示在体积不超过j、质量不超过k的情况下能够获得的最大总卡路里。这里j对应体积k对应质量。2. 状态转移当前食品体积 h 质量 t 卡路里 x如果不选dp[j][k]如果选择dp[j-h][k-t]x所以dp[j][k]max(dp[j][k],dp[j-h][k-t]x);3. 为什么两个容量都倒序因为每件食品只能选一次。如果正序for(intjh;jH;j)当前食品刚更新出来的状态可能继续参与本轮后面的转移相当于同一件食品被使用了多次。因此必须for(intjH;jh;j--){for(intkT;kt;k--){...}}4. 与普通01背包对比普通 01 背包一个容量限制状态dp[j]转移dp[j]max(dp[j],dp[j-w]v);NASA 食物计划两个容量限制状态dp[j][k]转移dp[j][k]max(dp[j][k],dp[j-h][k-t]x);5. 与 P1855 榨取kkksc03 对比题目两个容量价值P1855 榨取kkksc03金钱 时间每完成一个愿望1P1507 NASA的食物计划体积 质量每件食品有自己的卡路里x两题本质完全一样二维费用 01 背包只是价值不同。模型对比模型资源限制每件物品次数状态转移01背包1种一次dp[j]max(dp[j],dp[j-w]v)完全背包1种无限次dp[j]容量正序二维费用01背包2种一次dp[j][k]两个容量都倒序一句话总结看到“两个容量限制 每件物品只能选一次 求最大价值”想到二维费用 01 背包定义dp[j][k]两个容量全部倒序枚举。

相关新闻

手搓代码 vs AI编程:2小时实战构建Spring Boot待办事项API后端

手搓代码 vs AI编程:2小时实战构建Spring Boot待办事项API后端

1. 引子:一次“较真”的代码对决最近在技术社区里,关于“手搓代码”和“AI编程”谁更厉害的讨论就没停过。有人说AI是未来,动动嘴皮子就能生成代码,效率碾压;也有人坚持,没有扎实的手写功底,AI生…

2026/11/4 2:51:01 阅读更多 →
ISO 8601日期时间标准:从核心语法到工程实践的全解析

ISO 8601日期时间标准:从核心语法到工程实践的全解析

1. 为什么我们需要ISO 8601:从混乱到秩序如果你曾经因为一封邮件里写着“03/04/2023”而困惑,不知道它指的是3月4日还是4月3日;如果你曾经在跨国协作时,因为时区换算错误而错过了一个重要的线上会议;或者,你…

2026/11/3 9:24:18 阅读更多 →
AI搜索时代,选诚AI搜索GEO优化如何赋能企业数字化增长

AI搜索时代,选诚AI搜索GEO优化如何赋能企业数字化增长

随着大模型普及,用户获取信息的方式正在发生根本性转变。越来越多的人不再单纯浏览网页链接,而是直接向AI助手提问,获取整合式的答案输出。生成式引擎优化GEO(Generative Engine Optimization),正是面向AI搜…

2026/11/3 14:38:48 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/4 1:35:24 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/4 6:23:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻