新闻中心
c++ 动态规划背包问题 c++ dp算法入门教程
0-1背包问题通过动态规划求解,定义dpi为前i个物品在容量j下的最大价值,转移方程为dpi=max(dpi-1, dpi-1]+v[i-1]),初始状态dp0=0;可用二维数组实现,也可优化为一维数组,从后往前遍历避免覆盖;该思想扩展至完全背包、多重背包等问题。

动态规划(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妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
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邮箱账号注册 电脑版登录入口


2025-11-26
浏览次数:次
返回列表