news 2026/6/13 14:39:19

动态规划-背包问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划-背包问题

问题描述:0-1背包问题
输入:
一个背包,容量为 W。
n 个物品,每个物品有重量 w[i] 和价值 v[i]。
目标:在不超过背包容量的前提下,选择物品使得总价值最大。
限制:每个物品只能选 0 次(不选)或 1 次(选),不能分割。
示例:

背包容量 W = 5。
物品列表:[(重量, 价值)] = [(2, 3), (3, 4), (4, 5)]。
最大价值是多少?

动态规划的原理

  1. 分解问题:定义状态
    动态规划将问题分解为子问题,并通过状态表示子问题的解。对于背包问题:

状态定义:dp[i][j] 表示前 i 个物品在背包容量为 j 时的最大价值。
i:物品的索引(从 0 到 n-1)。
j:背包的剩余容量(从 0 到 W)。
2. 状态转移方程
对于每个物品 i 和容量 j,有两种选择:

不选第 i 个物品:dp[i][j] = dp[i-1][j](价值不变)。
选第 i 个物品:如果 w[i] <= j,则 dp[i][j] = dp[i-1][j - w[i]] + v[i](价值增加 v[i],但容量减少 w[i])。
最终取两种选择的最大值:

python
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]) # 如果 w[i] <= j
3. 初始化
当 i = 0(没有物品)或 j = 0(容量为 0)时,dp[0][j] = 0 和 dp[i][0] = 0(无法装任何物品,价值为 0)。
4. 计算顺序
外层循环:遍历物品 i(从 1 到 n)。
内层循环:遍历容量 j(从 1 到 W)。
按顺序填充 dp 表,确保计算 dp[i][j] 时,dp[i-1][…] 已经计算完成。
5. 返回结果
最终结果是 dp[n][W],即前 n 个物品在容量为 W 时的最大价值。

#include<iostream>#include<vector>#include<algorithm>// 用于 std::maxusingnamespacestd;intknapsack_01(intW,vector<pair<int,int>>&items){intn=items.size();// 物品数量// dp[i][j] 表示前 i 个物品在容量 j 时的最大价值vector<vector<int>>dp(n+1,vector<int>(W+1,0));for(inti=1;i<=n;++i){intw=items[i-1].first;// 当前物品的重量intv=items[i-1].second;// 当前物品的价值for(intj=1;j<=W;++j){if(w>j){// 当前物品太重,无法装入背包dp[i][j]=dp[i-1][j];}else{// 选择装或不装当前物品,取最大值dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v);}}}returndp[n][W];// 返回最大价值}intmain(){intW=5;// 背包容量vector<pair<int,int>>items={{2,3},{3,4},{4,5}};// (重量, 价值)intmax_value=knapsack_01(W,items);cout<<"最大价值: "<<max_value<<endl;// 输出: 7return0;}

代码解析
输入参数:
W:背包的最大容量。
items:物品列表,每个物品是一个 pair<int, int>,分别表示重量和价值。
动态规划表 dp:
dp[i][j] 表示前 i 个物品在背包容量为 j 时的最大价值。
初始化时,dp 表的所有值设为 0。
状态转移:
不选第 i 个物品:dp[i][j] = dp[i-1][j](直接继承前 i-1 个物品的结果)。
选第 i 个物品:如果 w <= j,则 dp[i][j] = dp[i-1][j - w] + v(装入当前物品,价值增加 v,但容量减少 w)。
最终取两者的最大值:
cpp
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w] + v);
初始化:
dp[0][j] = 0(没有物品时价值为 0)。
dp[i][0] = 0(容量为 0 时无法装任何物品)。
结果:
dp[n][W] 即为前 n 个物品在容量 W 时的最大价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 19:20:08

HuggingFace Spaces部署Qwen-Image在线Demo全记录

HuggingFace Spaces部署Qwen-Image在线Demo全记录 在AI生成内容&#xff08;AIGC&#xff09;迅速渗透创意产业的今天&#xff0c;一个摆在开发者面前的现实问题是&#xff1a;如何让实验室里训练出的强大模型真正被用户“看见”和“用上”&#xff1f;尤其当模型具备像200亿参…

作者头像 李华
网站建设 2026/6/12 9:37:33

制作小红书图片的必备工具与模板推荐

制作吸引人的小红书图片是内容创作者展示个人风格和分享生活方式的重要方式。首先&#xff0c;明确你的内容主题和风格是关键。这包括选择合适的主题&#xff0c;如美妆、旅行或美食&#xff0c;同时选择与之匹配的视觉风格&#xff0c;以确保整体效果一致。 接下来&#xff0…

作者头像 李华
网站建设 2026/6/12 20:56:32

暗黑破坏神II终极角色定制指南:从新手到专家的完整解决方案

暗黑破坏神II终极角色定制指南&#xff1a;从新手到专家的完整解决方案 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为反复刷装备而疲惫不堪&#xff1f;是否曾经因为属性点分配错误而不得…

作者头像 李华
网站建设 2026/6/12 18:43:19

实体状态和动画的同步

SynchedEntityData 详解 - Minecraft 状态与动画同步的核心机制 一、SynchedEntityData 系统整体架构 1. 系统定位 SynchedEntityData 是 Minecraft 中服务器与客户端数据同步的核心系统,负责在多人游戏中保持实体状态的一致性。这是连接服务器AI逻辑和客户端动画渲染的桥梁…

作者头像 李华
网站建设 2026/6/13 1:15:59

利用cpolar告别局域网束缚!DbGate 让数据库管理随时随地随心

文章目录前言通过 DbGate 与内网穿透的配合&#xff0c;数据库管理变得灵活高效&#xff0c;打破了空间限制&#xff0c;让工作更自由。前言 DbGate 是一款覆盖多种数据库类型的管理工具&#xff0c;无论是关系型的 MySQL&#xff0c;还是 NoSQL 的 MongoDB、Redis 等都能轻松…

作者头像 李华