尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
《背包问题:C++ 中的“资源分配”与“空间压缩”》
你是一个货车司机CPU车斗容量有限背包容量。货场里有一堆货物物品每个货物有重量和价值。你的目标是在不超重的前提下装下价值最高的货物组合。模块一0-1 背包标准二维版1. 思路讲解定义dp[i][w]考虑前i件物品背包容量为w时能装的最大价值。对于第i件物品面临两个选择不装dp[i][w] dp[i-1][w]价值继承上一轮。装dp[i][w] dp[i-1][w-weight[i]] value[i]腾出空间加上价值。取两者最大值。2. 代码详解cppcpp#include vector #include algorithm using namespace std; class Solution { public: int knapsack(int N, int W, vectorint wt, vectorint val) { // dp[i][w]: 前i个物品容量w下的最大价值 vectorvectorint dp(N 1, vectorint(W 1, 0)); for (int i 1; i N; i) { // 遍历物品 for (int w 1; w W; w) { // 遍历容量 // 如果当前物品重量超过当前背包容量没法装 if (wt[i - 1] w) { dp[i][w] dp[i - 1][w]; } else { // 核心装 vs 不装 dp[i][w] max( dp[i - 1][w], // 不装 dp[i - 1][w - wt[i - 1]] val[i - 1] // 装 ); } } } return dp[N][W]; } };C 细节wt[i-1]是因为数组下标从 0 开始而 DP 下标从 1 开始为了省去初始化第 0 行的麻烦。模块二0-1 背包一维优化版 - 滚动数组1. 思路讲解观察二维 DP 表发现dp[i][...]只依赖于dp[i-1][...]。我们可以将二维压缩为一维dp[w]。关键难点为什么容量w必须倒序遍历如果正序遍历dp[w-weight[i]]可能已经被本轮第 i 个物品更新过了这就变成了“完全背包”物品可重复选取。倒序遍历能保证dp[w-weight[i]]一定是上一轮i-1的数据。2. 代码详解cppcppclass Solution { public: int knapsack(int N, int W, vectorint wt, vectorint val) { vectorint dp(W 1, 0); // 一维数组 for (int i 0; i N; i) { // 遍历物品 // 关键倒序遍历容量防止数据污染 for (int w W; w wt[i]; w--) { // dp[w] 相当于二维的 dp[i-1][w] // dp[w-wt[i]] 相当于二维的 dp[i-1][w-wt[i]] dp[w] max(dp[w], dp[w - wt[i]] val[i]); } } return dp[W]; } };口诀“0-1 背包倒着走完全背包顺着走”。模块三分割等和子集背包思想的应用1. 思路讲解能不能将一个数组分成两个和相等的子数组转化为能不能从数组中挑选一些数使得它们的和恰好等于sum/2。这是一个“背包容量为 sum/2物品重量为 nums[i]价值也为 nums[i]”​ 的 0-1 背包问题。2. 代码详解cppcppclass Solution { public: bool canPartition(vectorint nums) { int sum 0; for (int num : nums) sum num; if (sum % 2 ! 0) return false; // 奇数不可能平分 int target sum / 2; vectorbool dp(target 1, false); dp[0] true; // 什么都不选和为0永远成立 for (int num : nums) { // 遍历物品 // 遍历容量倒序0-1背包特性 for (int j target; j num; j--) { // 如果减去当前num剩下的重量能被凑出来那当前重量也能被凑出来 dp[j] dp[j] || dp[j - num]; } } return dp[target]; } };思路dp[j]是布尔类型表示能否凑出和为j。这里使用了逻辑或||。谢谢
RELATED

相关推荐

杭州系统门窗口碑好的品牌推荐

杭州系统门窗口碑好的品牌推荐

杭州装修业主换门窗,一般会先看本地口碑稳的品牌,工艺、售后和性价比都兼顾,很多人更愿意选本地有工厂的,方便去厂里看看、当面聊。杭州本地系统门窗的工厂优势 本地生产的系统门窗,能更好满足杭州及周边绍兴、嘉兴、湖…

📅 2026/9/15 14:28:57
负指数信号梯形成型 Python 实现:3 参数调优与 FPGA 递推公式推导

负指数信号梯形成型 Python 实现:3 参数调优与 FPGA 递推公式推导

负指数信号梯形成型的Python实现与FPGA递推公式深度解析 引言:核脉冲信号处理的技术挑战 在辐射探测与核电子学领域,探测器输出的原始信号通常表现为快速上升、缓慢衰减的负指数波形。这种信号形态给后续的幅度提取和时间测量带来了显著挑战&#xff1a…

📅 2026/8/22 20:16:01
Codex 实战:用项目结果反推能力

Codex 实战:用项目结果反推能力

聊《Codex 实战:一次新的项目切入》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里…

📅 2026/8/22 20:16:01
MORE NEWS

更多资讯

📰

Flutter与鸿蒙融合中的依赖版本管理实践

1. 项目背景与核心挑战在跨平台开发领域,Flutter与鸿蒙系统的融合正成为技术热点。satisfied_version作为Flutter生态中管理依赖版本约束的关键组件,其鸿蒙适配面临三个维度的挑战:首先是语义化版本(SemVer)的精确解析…

📰

LightRAG架构优化:提升AI问答系统性能的关键技术

1. 项目背景与核心挑战在构建AI答疑助手的过程中,我们遇到了传统RAG(Retrieval-Augmented Generation)架构的几个典型瓶颈:首先是知识检索效率问题,当文档库规模超过百万级时,传统向量检索的响应时间明显延…

📰

OpenCV与C#实现工业级直线卡尺测量工具

1. 项目概述:OpenCV与C#结合的直线卡尺工具在工业视觉检测领域,直线卡尺工具是基础但至关重要的测量组件。这个开源项目使用OpenCV和C#构建了一个专业的直线边缘测量工具,能够精确识别图像中的直线边缘并计算像素级距离。不同于商业软件如Hal…

📰

YOLO v11架构升级:从检测框架到端到端感知引擎

1. 这不是“又一个YOLO版本对比”,而是你明年要不要重写训练Pipeline的决策依据YOLO v5→v11这个标题,表面看是版本迭代,实则是一场悄无声息的工程范式迁移。过去三年我带过17个工业视觉项目,从产线缺陷检测到仓储AGV导航&#xf…

📰

Python生成器原理与应用:从惰性求值到协程实践

1. 为什么我们需要生成器?第一次接触Python生成器时,我正面临一个棘手的内存问题。当时需要处理一个10GB的日志文件,尝试用常规列表读取时,程序直接崩溃。这就是生成器大显身手的场景——它让我们能够按需生成值,而不是…

📰

NI工业AI测试:边缘原生与信号级嵌入的闭环实践

1. 这不是“加个AI按钮”——NI把AI塞进测试测量工作流的真实逻辑很多人看到“NI把AI带进测试测量工作流”这个标题,第一反应是:哦,又一个在仪器界贴AI标签的营销话术。我2016年刚接手某汽车电子产线自动化测试系统时也这么想。当时客户指着L…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬