0

0

C++怎么实现动态规划_C++背包问题教程【算法】

穿越時空

穿越時空

发布时间:2026-02-26 12:33:47

|

315人浏览过

|

来源于php中文网

原创

std::vector比裸数组更适合背包dp,因其自动管理堆内存、支持动态resize、避免栈溢出和初始化遗漏;一维优化用vector dp(w+1,0),二维用vector dp(n+1,vector(w+1,0))。

c++怎么实现动态规划_c++背包问题教程【算法】

为什么 std::vector 比裸数组更适合写背包 DP

因为背包问题需要频繁访问「前一层状态」,而动态规划的二维递推(比如 dp[i][w])在 C++ 里容易因栈溢出或手动内存管理翻车。用 std::vector 能自动管理堆内存,且支持按需 resize,避免越界或初始化遗漏。

实操建议:

  • 一维优化时用 std::vector<int> dp(W + 1, 0)</int>,别手写 int dp[10005] —— W 大于 1e5 就炸栈
  • 二维原始写法优先用 std::vector<:vector>> dp(N + 1, std::vector<int>(W + 1, 0))</int></:vector>,别用 new int*[N] 手动二维指针,析构麻烦还易漏
  • 初始化值要对齐语义:01 背包求最大价值填 0;恰好装满型必须填 INT_MIN(除 dp[0] = 0),否则无效状态会被错误转移

for (int w = W; w >= weight[i]; w--) 这个倒序到底在防什么

它防的是「同一件物品被重复使用」——也就是把 01 背包错写成完全背包。正序遍历 w 会让 dp[w - weight[i]] 已经是本轮更新过的值,相当于悄悄用了两次 i 物品。

常见错误现象:

立即学习C++免费学习笔记(深入)”;

WOMBO
WOMBO

使用AI创作美丽的艺术品

下载
  • 输入 weights = [2], W = 4,正序得到 dp[4] = 2 * value[0],但题目只给 1 个物品
  • 调试时发现结果比预期大,尤其当所有 value[i] 相同,会明显看出倍数关系
  • 换成完全背包?那就改回正序,但得确认题干真允许无限取——很多 OJ 题面写“每种物品一个”,却有人默认能刷

空间优化后怎么还原具体选了哪些物品

一维 dp 数组不存路径信息,直接还原不了。必须保留决策过程,或者多开一维记录选择标记。

实操建议:

  • 如果只要答案值,坚持一维节省空间;如果要输出方案,老老实实用二维 dp[i][w],再加一个 chosen[i][w] 布尔数组记录「是否选了第 i 个」
  • 更省内存的做法:用 std::vector<:vector>> chosen(N + 1, std::vector<bool>(W + 1))</bool></:vector>,每个 chosen[i][w] 表示在考虑前 i 个、容量为 w 时,是否选了第 i 个
  • 还原时从 i = N, w = W 往回推:若 chosen[i][w] 为真,则加入第 i 个,并令 w -= weight[i-1](注意下标偏移)

LeetCode 416 和 AcWing 2.01 背包的输入差异怎么影响写法

LeetCode 416 是「分割等和子集」,本质是 01 背包判断能否恰好装满 sum / 2;AcWing 2.01 是标准输入格式(先 N W,再每行 weight value)。两者状态定义一致,但边界处理差很多。

关键差异点:

  • LeetCode 416 不需要 value 数组,weight[i] 同时是体积和价值,目标是让总和恰好等于 target,所以初始化要用 dp[0] = true,其余 false
  • AcWing 数据范围常带「多组测试」,记得每次清空 dp 或重置为初始值,别用全局变量残留上一组结果
  • sum 是奇数时,LeetCode 416 直接返回 false;而 AcWing 若没这条件,可能卡在 target = sum / 2 下取整导致 WA

复杂点往往不在状态转移本身,而在题干对「恰好」「不超过」「最大价值」这些词的咬文嚼字,以及初始化时对无效状态的屏蔽方式——稍不注意,dp[0] 多设一个 1,整个表就全偏了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

585

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

425

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

597

2023.08.10

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

331

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号