news 2026/5/5 2:03:10

动态规划-背包问题

作者头像

张小明

前端开发工程师

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/5/5 20:31:03

ZonyLrcToolsX 终极歌词下载工具:让每首歌都有完美歌词陪伴

ZonyLrcToolsX 终极歌词下载工具&#xff1a;让每首歌都有完美歌词陪伴 【免费下载链接】ZonyLrcToolsX ZonyLrcToolsX 是一个能够方便地下载歌词的小软件。 项目地址: https://gitcode.com/gh_mirrors/zo/ZonyLrcToolsX 还在为音乐播放器里缺少歌词而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/5/3 14:23:19

基于 Qt6 Multimedia 的实时音频 RTP 传输方案报告

基于 Qt6 Multimedia 的实时音频 RTP 传输方案报告 日期&#xff1a; 2025年12月15日 主题&#xff1a; 音频采集、编码、RTP打包发送及接收、解码、播放的实现 环境&#xff1a; Qt 6.x (C), Network Module, Multimedia Module1. 概述 本报告旨在阐述如何使用 Qt6 的多媒体和…

作者头像 李华
网站建设 2026/5/1 11:45:11

OpenWrt磁盘管理神器luci-app-diskman全面解析

OpenWrt磁盘管理神器luci-app-diskman全面解析 【免费下载链接】luci-app-diskman Disk Manager for LuCI 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-diskman 项目概述 luci-app-diskman是OpenWrt生态系统中备受推崇的磁盘管理解决方案&#xff0c;为路由…

作者头像 李华
网站建设 2026/5/5 5:35:47

【分析式AI】-特征工程(二手车价格预算举例说明)

专业化的特征工程解释 特征工程&#xff08;Feature Engineering&#xff09;是机器学习中提升模型性能的核心步骤&#xff0c;核心在于对原始数据进行三类操作&#xff1a; 特征选择&#xff1a;筛选与预测目标强相关的特征&#xff0c;剔除冗余信息&#xff08;如二手车价格预…

作者头像 李华
网站建设 2026/5/2 9:38:23

Cangaroo开源CAN总线分析工具完整使用指南

Cangaroo开源CAN总线分析工具完整使用指南 【免费下载链接】cangaroo 项目地址: https://gitcode.com/gh_mirrors/ca/cangaroo Cangaroo是一款功能强大的开源CAN总线分析软件&#xff0c;专为汽车电子工程师和嵌入式系统开发者设计。该工具提供全面的CAN数据监控、DBC文…

作者头像 李华