《LeetCode 1049 最后一块石头的重量||》
一、题目1049. 最后一块石头的重量 II - 力扣LeetCode二、做题思路问题转化前置分析每次粉碎两块石头本质上是将石头分成两堆然后不断抵消最终剩下的重量等于两堆重量之差的绝对值。设所有石头总重量为sum两堆重量分别为a和b则a b sum最终剩余重量为|a - b|。为了使剩余重量最小应使两堆重量尽可能接近即让其中一堆的重量不超过sum/2且尽可能大。因此问题转化为从数组中选取若干块石头使其总重量不超过sum/2求该总重量能取到的最大值即 01 背包容量为sum/2的最大价值问题。1. 状态表示核心基础定义dp[i][j]表示从前i块石头中选取若干块总重量不超过j时能获得的最大总重量。i范围0到nj范围0到targettarget sum/2。该状态与标准 01 背包完全一致价值就是重量本身。2. 状态转移方程关键难点对于第i块石头重量stones[i-1]有两种决策不选最大重量为dp[i-1][j]。选前提是j stones[i-1]最大重量为dp[i-1][j - stones[i-1]] stones[i-1]。取两者较大值dp[i][j] max(dp[i-1][j], (j stones[i-1] ? dp[i-1][j - stones[i-1]] stones[i-1] : 0))。3. 初始化边界防护前0块石头无论容量多少最大总重量均为0因此dp[0][j] 0默认初始化为0即可。无需额外赋值。4. 填表顺序递推方向dp[i][j]依赖上一行dp[i-1][j]和dp[i-1][j - stones[i-1]]因此需要按行从上到下i从 1 到n列从左到右j从 1 到target遍历保证前置状态已就绪。5. 返回值目标映射设dp[n][target]为其中一堆能达到的最大重量不超过sum/2则另一堆重量为sum - dp[n][target]最终剩余重量为两者之差return (sum - dp[n][target]) - dp[n][target]即sum - 2 * dp[n][target]。三、代码class Solution { public: bool canPartition(vectorint nums) { // 1. 计算数组总和若为奇数则不可能平分 int sum 0; for (auto x : nums) sum x; if (sum % 2 ! 0) return false; int target sum / 2; // 目标子集和 int n nums.size(); // 2. 创建dp表 // dp[i][j] 表示能否从前 i 个元素中选取若干个数使其和恰好为 j vectorvectorbool dp(n 1, vectorbool(target 1, false)); // 3. 初始化 // 前 i 个元素中选出和为 0 的方案总是存在即什么都不选所以 dp[i][0] true for (int i 0; i n; i) { dp[i][0] true; } // 4. 填表顺序外层遍历物品i 从 1 到 n内层遍历容量j 从 1 到 target // 因为 dp[i][j] 依赖于 dp[i-1][j]不选当前数和 dp[i-1][j-nums[i-1]]选当前数 // 所以按行从上到下、列从左到右即可。 for (int i 1; i n; i) { for (int j 1; j target; j) { // 5. 状态转移方程 // 不选第 i 个数继承上一行的状态 dp[i-1][j] // 选第 i 个数前提是 j nums[i-1]且 dp[i-1][j-nums[i-1]] 为 true dp[i][j] dp[i - 1][j]; if (j nums[i - 1]) { dp[i][j] dp[i][j] || dp[i - 1][j - nums[i - 1]]; } } } // 6. 返回值dp[n][target] 表示能否从前 n 个数中选出和为 target 的子集 return dp[n][target]; } };四、流程图五、优化状态转移方程对于当前石头stones[i-1]第i个有两种决策不选最大重量不变即dp[j]保持上一轮的值。选前提是j stones[i-1]最大重量为上一轮dp[j - stones[i-1]] stones[i-1]。取两者较大值dp[j] max(dp[j], dp[j - stones[i-1]] stones[i-1])当j stones[i-1]时。等号右边的dp[j]和dp[j - stones[i-1]]均代表上一轮未处理当前石头的状态这正是逆序遍历保证的。填表顺序外层循环遍历每块石头i从 1 到n内层循环必须逆序遍历容量j从target到stones[i-1]。为什么要倒序因为dp[j]的更新依赖dp[j - stones[i-1]]这个值必须是上一轮未处理当前石头的状态才能保证每块石头最多被选一次01 背包性质。如果采用正序dp[j - stones[i-1]]可能已经在当前石头的处理中被提前更新导致石头被重复使用结果错误。为什么j只降到stones[i-1]当j stones[i-1]时无法选取当前石头dp[j]保持原值无需更新因此可以缩小遍历范围减少无用计算。class Solution { public: int lastStoneWeightII(vectorint stones) { int sum 0; for (auto x : stones) sum x; int target sum / 2; int n stones.size(); // 一维滚动数组 dp[j]替代原来的 dp[i][j]只保留“当前物品处理后的状态” vectorint dp(target 1, 0); for (int i 1; i n; i) { // 倒序遍历容量 j确保 dp[j - stones[i-1]] 是上一轮未选当前物品的值 // 避免同一物品被重复选取0/1背包特性。 // 下界为 stones[i-1]容量不足时无需更新直接继承旧值。 for (int j target; j stones[i - 1]; j--) { // 状态转移直接在一维数组上原地更新 // dp[j] max(不选当前物品的旧值, 选当前物品的新值) dp[j] max(dp[j], dp[j - stones[i - 1]] stones[i - 1]); } } // 结果计算与二维版本一致 int b sum - dp[target]; return b - dp[target]; } };

相关新闻

CMake-IDE 故障排除:常见问题和解决方案的完整清单

CMake-IDE 故障排除:常见问题和解决方案的完整清单

CMake-IDE 故障排除:常见问题和解决方案的完整清单 【免费下载链接】cmake-ide 项目地址: https://gitcode.com/gh_mirrors/cm/cmake-ide CMake-IDE 是一款专为 Emacs 用户设计的 CMake 集成开发环境插件,能帮助开发者自动配置编译环境、管理项目…

2026/7/17 12:29:47 阅读更多 →
视频下载神器:三步轻松保存网页视频,告别“只能看不能存“的烦恼

视频下载神器:三步轻松保存网页视频,告别“只能看不能存“的烦恼

视频下载神器:三步轻松保存网页视频,告别"只能看不能存"的烦恼 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper …

2026/7/17 12:29:47 阅读更多 →
Claude代码解释准确率暴跌的隐藏开关:我们逆向了Anthropic最新v3.5模型的代码推理层(附12个可控干预点)

Claude代码解释准确率暴跌的隐藏开关:我们逆向了Anthropic最新v3.5模型的代码推理层(附12个可控干预点)

更多请点击: https://intelliparadigm.com 第一章:Claude代码解释准确率暴跌的现象溯源与问题定义 近期多位开发者反馈,Claude系列模型(特别是Claude 3 Sonnet与Haiku)在解析结构化代码片段时出现显著性能退化——准…

2026/7/17 12:29:47 阅读更多 →

最新新闻

元景万悟:企业级多租户AI开发平台的完整指南

元景万悟:企业级多租户AI开发平台的完整指南

元景万悟:企业级多租户AI开发平台的完整指南 【免费下载链接】wanwu China Unicoms Yuanjing Wanwu Agent Platform is an enterprise-grade, multi-tenant AI agent development platform. It helps users build applications such as intelligent agents, workflo…

2026/7/17 13:14:14 阅读更多 →
Nintendo Switch Eshop 数据提取库:跨区域游戏数据采集的完整技术指南

Nintendo Switch Eshop 数据提取库:跨区域游戏数据采集的完整技术指南

Nintendo Switch Eshop 数据提取库:跨区域游戏数据采集的完整技术指南 【免费下载链接】nintendo-switch-eshop Crawler for Nintendo Switch eShop 项目地址: https://gitcode.com/gh_mirrors/ni/nintendo-switch-eshop 在游戏数据分析和市场研究领域&#…

2026/7/17 13:14:14 阅读更多 →
WrenAI企业级容器化部署终极指南:5大策略优化GenBI性能与资源效率

WrenAI企业级容器化部署终极指南:5大策略优化GenBI性能与资源效率

WrenAI企业级容器化部署终极指南:5大策略优化GenBI性能与资源效率 【免费下载链接】WrenAI GenBI (Generative BI) for AI agents, an open-source, governed text-to-SQL through an open context layer that turns natural-language questions into trusted dashb…

2026/7/17 13:14:14 阅读更多 →
Meta Muse Image AI功能上线三天因隐私争议暂停 默认opt-in机制引争议

Meta Muse Image AI功能上线三天因隐私争议暂停 默认opt-in机制引争议

Meta于2026年7月推出Instagram Muse Image AI工具,支持基于公开账号生成图片并自动opt-in,数天后因隐私争议暂停该引用功能。 事实还原 2026年7月,Meta Superintelligence Labs发布首款图像生成模型Muse Image,并整合至Meta AI聊…

2026/7/17 13:12:13 阅读更多 →
Unity机器人仿真解决方案:URDF-Importer实现工业级机器人模型快速导入与配置

Unity机器人仿真解决方案:URDF-Importer实现工业级机器人模型快速导入与配置

Unity机器人仿真解决方案:URDF-Importer实现工业级机器人模型快速导入与配置 【免费下载链接】URDF-Importer URDF importer 项目地址: https://gitcode.com/gh_mirrors/ur/URDF-Importer URDF-Importer是Unity Robotics官方推出的机器人描述格式导入工具&am…

2026/7/17 13:10:13 阅读更多 →
如何免费实现Windows桌面分区管理?NoFences开源方案解析

如何免费实现Windows桌面分区管理?NoFences开源方案解析

如何免费实现Windows桌面分区管理?NoFences开源方案解析 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 厌倦了杂乱无章的Windows桌面?不想为商业桌面…

2026/7/17 13:08:12 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/17 3:22:28 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/17 3:01:28 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻