新闻中心

c++ 动态规划背包问题 c++ dp算法入门教程

2025-11-26
浏览次数:
返回列表
0-1背包问题通过动态规划求解,定义dpi为前i个物品在容量j下的最大价值,转移方程为dpi=max(dpi-1, dpi-1]+v[i-1]),初始状态dp0=0;可用二维数组实现,也可优化为一维数组,从后往前遍历避免覆盖;该思想扩展至完全背包、多重背包等问题。

c++ 动态规划背包问题 c++ dp算法入门教程

动态规划(Dynamic Programming,简称 DP)是算法中非常重要的思想,尤其在解决最优化问题时非常有效。背包问题是学习 DP 的经典入门题,帮助理解状态定义、转移方程和边界处理。本文以 0-1 背包为例,带你用 C++ 快速掌握 DP 基础。

什么是 0-1 背包问题?

你有一个容量为 V 的背包,和 n 个物品。每个物品有重量 w[i] 和价值 v[i]。每件物品只能选或不选(即“0 或 1”),目标是让装入背包的物品总价值最大。

输入示例:
n = 4, V = 8
w = [2, 3, 4, 5]
v = [3, 4, 5, 6]

输出:10(选第1、2、4个物品,总重 2+3+5=10?不对,超了。正确组合是第2和第4:3+5=8,价值 4+6=10)

DP 状态设计与转移方程

我们定义:
dp[i][j] 表示前 i 个物品中,背包容量为 j 时能获得的最大价值。

对于第 i 个物品(下标从 1 开始),有两种选择:

  • 不选:dp[i][j] = dp[i-1][j]
  • 选(前提是 j ≥ w[i-1]):dp[i][j] = dp[i-1][j - w[i-1]] + v[i-1]

所以转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i-1]] + v[i-1])

初始条件:dp[0][j] = 0(没有物品,价值为0)

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多

C++ 实现代码(二维数组版本)

这是最容易理解的写法:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
<p>int main() {
int n, V;
cin >> n >> V;
vector<int> w(n), v(n);
for (int i = 0; i < n; i++) {
cin >> w[i] >> v[i];
}</p><pre class="brush:php;toolbar:false;">vector<vector<int>> dp(n + 1, vector<int>(V + 1, 0));

for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= V; j++) {
        dp[i][j] = dp[i-1][j]; // 不选
        if (j >= w[i-1]) {
            dp[i][j] = max(dp[i][j], dp[i-1][j - w[i-1]] + v[i-1]);
        }
    }
}

cout << dp[n][V] << endl;
return 0;

}

空间优化:一维数组滚动

观察发现:每次只依赖上一行的数据。可以将空间从 O(nV) 降到 O(V)。

关键点:内层循环要从后往前遍历,避免覆盖还未计算的状态。

vector<int> dp(V + 1, 0);
for (int i = 0; i < n; i++) {
    for (int j = V; j >= w[i]; j--) {
        dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
    }
}
cout << dp[V] << endl;

这个版本更简洁,是竞赛常用写法。

常见变种与扩展

  • 完全背包:每种物品可选无限次。只需改变内层循环方向:从前往后遍历 j。
  • 多重背包:每种物品最多选 m[i] 次。可通过二进制拆分优化成 0-1 背包。
  • 分组背包:每组选一个,枚举组 → 枚举容量 → 枚举组内物品。

掌握 0-1 背包,就掌握了 DP 的核心思维方式:拆解问题、定义状态、找出转移关系。

基本上就这些。多写几遍代码,自己推一遍状态转移,很快就能上手。

以上就是c++++ 动态规划背包问题 c++ dp算法入门教程的详细内容,更多请关注其它相关文章!


# 迭代  # 泉州排名seo优化服务  # 朔州网站建设有什么作用  # 成都网站营销优化  # 自建购物网站脸书推广  # 小龙seo博客  # 网站营销推广和内容策划  # 样做网站推广  # seo生态  # 潍坊做推广网站有哪些好  # 介绍seo规则  # 只需  # 就能  # 动态规划  # 这是  # 管理规则  # 运算符  # 如何判断  # 什么用  # 不选  # 遍历  # stream  # ios  # ai  # go  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 大麦的“候补”是什么意思 大麦候补购票规则【详解】  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  J*aScript中高效管理与清空动态列表:避免循环陷阱  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  微信语音通话掉线如何解决 微信语音通话稳定优化方法  Linux如何构建多环境配置管理_Linux多环境配置方案  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  12306选座系统怎么选连座_12306选座多人连坐操作方法  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  限制HTML日期输入框的日期选择范围  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  大象笔记网页版入口 印象笔记网页版登录入口  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  Golang如何使用context实现超时取消_Golang context超时取消模式实践  抓大鹅无需下载版 抓大鹅秒玩版入口  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  抖音网页版快捷访问 抖音网页版网页版入口操作教程  C++如何实现单例模式_C++设计模式之线程安全的单例写法  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  163邮箱注册官网 免费申请163个人邮箱  J*aScript数据结构转换:将对象数组按类别分组  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  SteamMachine定价或为699美元 大家想入手吗?  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  必由学登录入口 必由学官方网站在线访问链接  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  Centos/Linux 系统下安装 composer 的完整步骤  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  ArrayList与LinkedList核心操作的Big-O复杂度分析  整合Supabase认证与Django模型:跨模式迁移的解决方案  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  html5 app怎么运行环境_配html5 app运行环境【教程】  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  美团外卖商家服务中心入口 美团商家版官网入口  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  126邮箱账号注册 电脑版登录入口 

搜索