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(从 Wweight[i-1]),否则会重复使用刚更新过的值,导致一个物品被多次选取(退化成完全背包)。

常见错误现象:dp[W] 结果明显偏大,甚至超过所有物品价值之和——大概率是正向遍历了 j

实操建议:

  • 初始化 vector dp(W+1, 0)
  • 外层循环 i 从 0 到 n-1
  • 内层循环 jW 降序到 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命令详解  北京网站制作的公司有哪些,北京白云观官方网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?