首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
C++使用动态规划解决01背包问题——优化版(附详细代码及图解)
📅 2026/9/7 20:01:03
✍️ 爱科研究院
👁 阅读 3,247
使用动态规划解决01背包问题——优化版一、引言二、优化说明三、优化思路四、重点细节五、优化代码展示一、引言在上一篇文章“使用动态规划解决01背包问题(附详细代码及图解)”中介绍了使用动态规划解决01背包问题的思想以及详细代码。在本篇文章主要会对代码进行进一步的优化。二、优化说明在上一篇文章的代码中二维数组dp[i][j]存储了 “在前 i 个物品中不超过容量 j 的情况下可以获得的最大价值” 。这时候我们代码的空间复杂度为n*m。其实在dp[i][j]这个二维数组中前i-1维的数组所存储的数值都是十分鸡肋的这对我们的空间复杂度十分不友好。因此在优化代码中会用一个一维数组dp2[j]来改善这个问题使得程序的空间复杂度降低。三、优化思路首先代码的思路和使用二维数组时是一样的即逐一对每个i与j进行遍历获得“在前 i 个物品中不超过容量 j 的情况下可以获得的最大价值” 。但存储这个最大价值的二维数组变成了一维数组。核心代码实现的变化如下图所示。在优化后的代码中:最外层的循环每遍历完一次dp2记录的就是在前i个物品中不超过容量 j 的情况下可以获得的最大价值最外层的循环在每次遍历前dp2记录的就是在前i -1个物品中不超过容量 j 的情况下可以获得的最大价值。max(dp2[j],dp2[j-w[i]]v[i])和 **max(dp[i-1][j],dp[i-1][j-w[i]]v[i])**的作用其实是一样的。dp2[j]在没有进行赋值改变时他记录的是在前i -1个物品中不超过容量 j 的情况下可以获得的最大价值所以dp2[j]与dp[i-1][j]其实是同一个值。dp2[j-w[i]]v[i]和dp[i-1][j-w[i]]v[i]也是同理。四、重点细节在优化后的代码中有一个细节在里面那层循环中j一开始是为m然后递减的进行遍历。也就是说在遍历m时是从大到下进行遍历的。如果从小到大遍历那么就会出现下面这种情况在i2j5时dp2[5]max(dp2[5],dp2[5-w[2]]v[2])dp2[5]就会由1变为5j继续向后面遍历在i2j8时dp2[8]max(dp2[8],dp2[8-w[2]]v[2])dp2[8]就会由5变为9我们每种物品只有一种这明显不符合这是因为在遍历前dp2[j]记录的还是j-1层的数值如果从小到大去遍历进行改变那么前面部分的dp2[j]所记录的值就会变成当前j层的数值到后面部分的j就会以当前层的数值进行比较这会导致当前物品可不止放入一件的问题。而从大到小遍历j的话就可以完美解决这一问题。五、优化代码展示#includebits/stdc.h#includemath.husingnamespacestd;intmain(){vectorintw,v;vectorintdp2;intm,n;cout请输入背包的总重量endl;cinm;cout请输入物品数量endl;cinn;vectorvectorintdp(n1,vectorint(m1));w.push_back(0);v.push_back(0);for(inti0;in;i){cout请输入物品i1的重量和价值endl;intnew_w,new_v;cinnew_wnew_v;w.push_back(new_w);v.push_back(new_v);}// 一维数组背包问题for(inti1;in;i){for(intjm;w[i]j;j--){dp2[j]max(dp2[j],dp2[j-w[i]]v[i]);}}coutdp2[m]endl;return0;}
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/9/7 20:01:03
2026毕业论文降AI率实测:10款工具对比与避坑指南
2026/9/7 20:01:03
Buzz:离线语音转文字,录音不出电脑也能成稿
2026/9/7 19:56:03
8款高性价比AI写作辅助软件横向实测,本硕博撰稿避坑全指南
2026/9/7 23:01:54
整理4家门店注意事项 郴州夜宵好去处实用参考
2026/9/7 23:01:54
Czkawka免费重复文件查找器:一次扫描如何帮你找回数十GB空间
2026/9/7 23:01:54
Pretext:语义化排版引擎,让教材写作一次编写多端发布
2026/9/7 23:01:54
OpenCode v2 提供商策略(provider.use):experimental.policies 的设计与源码解析
2026/9/7 23:01:54
OpenCode插件安装与配置全攻略:以Skills插件为例
2026/9/7 22:56:54
Bagging与随机森林:从自助采样到OOB误差的实践指南
2026/9/7 0:03:59
基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现
2026/9/7 0:03:59
UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南
2026/9/7 0:03:59
BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析
2026/9/7 0:22:31
超人会飞不算本事:系统稳定依赖清晰规则与边界设计
2026/9/7 0:44:48
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
2026/9/7 1:55:33
基于CNN的调制信号识别:MATLAB实现时频图分类实战