c++中如何实现背包问题_c++ 01背包动态规划解法
发布时间 - 2026-01-02 00:00:00 点击率:次二维dpi定义最稳妥,因逻辑清晰、不易出错;初始化全0即可满足边界条件;转移时需判断j≥weight[i-1]避免越界;一维优化须倒序遍历以防重复选取。
为什么 dp[i][j] 定义成「前 i 个物品、容量为 j 时的最大价值」最稳妥
很多初学者会尝试用 dp[j] 一维数组直接推,但容易搞错遍历顺序或覆盖未使用的状态。二维定义虽然多占空间,但逻辑清晰、不易出错,尤其在调试和理解转移关系时更可靠。
关键点在于:每个物品只能选 0 次或 1 次,所以状态转移必须区分「不选第 i 个」和「选第 i 个」两种情况:
- 不选:
dp[i-1][j] - 选(前提是
j >= weight[i-1]):dp[i-1][j - weight[i-1]] + value[i-1]
注意物品数组通常从 0 开始索引,所以第 i 个物品对应 weight[i-1] 和 value[i-1]。
如何正确初始化 dp 数组并避免越界访问
初始化时,dp[0][j] 表示「前 0 个物品」能装下的最大价值,显然全为 0;dp[i][0] 表示「容量为 0」时的价值,也全为 0。但实际编码中,只要把整个 dp 数组初始化为 0,就能自然满足这两个边界条件。
真正容易出错的是状态转移中的下标检查:
- 必须判断
j >= weight[i-1]才能尝试选择第 i 个物品,否则跳过 - 二维数组大小应为
(n+1) x (W+1),其中n是物品数量,W是背包容量 - 如果用
vector,记得先 resize 正确维度,否则运行时可能崩溃>
一维优化版 dp[j] 的核心约束和遍历方向
一维写法节省空间,但必须倒序遍历容量 j(从 W 到 weight[i-1]),否则会重复使用刚更新过的值,导致一个物品被多次选取(退化成完全背包)。
常见错误现象:dp[W] 结果明显偏大,甚至超过所有物品价值之和——大概率是正向遍历了 j。
实操建议:
- 初始化
vectordp(W+1, 0) - 外层循环
i从 0 到n-1 - 内层循环
j从W降序到weight[i](含) - 转移式:
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
#include#include using namespace std; int knapsack01(const vector
& weight, const vector & value, int W) { int n = weight.size(); vector > dp(n + 1, vector (W + 1, 0)); for (int i = 1; i zuojiankuohaophpcn= n; ++i) { for (int j = 0; j zuojiankuohaophpcn= W; ++j) { dp[i][j] = dp[i-1][j]; // 不选第 i 个 if (j >= weight[i-1]) { dp[i][j] = max(dp[i][j], dp[i-1][j - weight[i-1]] + value[i-1]); } } } return dp[n][W];
}
一维优化看似简洁,但一旦数据规模变大或需要输出具体选了哪些物品,二维结构反而更容易回溯路径。别为了省几 MB 内存,让逻辑变得脆弱。
# go # 编码 # c++ # 为什么 # 循环 # 遍历 # 不选 # 的是 # 就能 # 两种 # 要把 # 这两个 # 更容易 # 则会 # 选了
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: js代码实现下拉菜单【推荐】 Python文本处理实践_日志清洗解析【指导】 专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站? 个人摄影网站制作流程,摄影爱好者都去什么网站? 香港服务器部署网站为何提示未备案? html如何与html链接_实现多个HTML页面互相链接【互相】 青岛网站建设如何选择本地服务器? 如何在不使用负向后查找的情况下匹配特定条件前的换行符 百度浏览器网页无法复制文字怎么办 百度浏览器复制修复 Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置 如何获取免费开源的自助建站系统源码? php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】 PHP正则匹配日期和时间(时间戳转换)的实例代码 如何在腾讯云免费申请建站? 如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南 香港服务器网站卡顿?如何解决网络延迟与负载问题? 标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等? 高端云建站费用究竟需要多少预算? 如何快速登录WAP自助建站平台? 大同网页,大同瑞慈医院官网? Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】 Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】 微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】 Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】 安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出 如何制作一个表白网站视频,关于勇敢表白的小标题? Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例 Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】 如何在云服务器上快速搭建个人网站? Python文件流缓冲机制_IO性能解析【教程】 如何快速建站并高效导出源代码? 如何获取上海专业网站定制建站电话? 无锡营销型网站制作公司,无锡网选车牌流程? Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO) 如何在宝塔面板中修改默认建站目录? 如何快速重置建站主机并恢复默认配置? 在线ppt制作网站有哪些软件,如何把网页的内容做成ppt? 详解jQuery停止动画——stop()方法的使用 Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程 Laravel Fortify是什么,和Jetstream有什么关系 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平? html文件怎么打开证书错误_https协议的html打开提示不安全【指南】 Laravel中间件如何使用_Laravel自定义中间件实现权限控制 晋江文学城电脑版官网 晋江文学城网页版直接进入 如何在宝塔面板中创建新站点? Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】 高配服务器限时抢购:企业级配置与回收服务一站式优惠方案 Linux系统命令中tree命令详解 北京网站制作的公司有哪些,北京白云观官方网站? 专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?


][W];