当前位置: 首页 > news >正文

动态规划-背包问题

问题描述: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 时的最大价值。

http://www.cnnetsun.cn/news/71563.html

相关文章:

  • 收藏!大模型时代,产品经理如何突破成长天花板?
  • 在Windows环境下部署Seed-Coder-8B-Base的详细步骤
  • C语言中的面向对象思想
  • 微信视频号直播弹幕抓取技术实现与架构解析
  • 火山引擎AI大模型平台迁移至Qwen3-VL-30B的成本效益分析
  • Linux挂载核心:一文搞懂fstab的作用与配置实战
  • Beyond Compare软件功能扩展技术配置指南
  • Miniconda如何帮助你节省大模型训练前的环境准备时间?
  • docker run启动Qwen3-32B容器的常用参数详解
  • 实习面试题-JavaScript 面试题
  • 解决‘此扩展程序不再受支持’问题:FLUX.1-dev开发环境兼容性优化方案
  • 火山引擎AI大模型生态中FLUX.1-dev的独特定位分析
  • 抖音直播回放永久保存指南:告别内容丢失的烦恼
  • Bypass Paywalls Clean完整使用教程:快速解锁全网付费内容
  • 国产CAD实现铸造与热处理工艺的标准化控制
  • 微PE官网同款推荐!HunyuanVideo-Foley模型运行环境快速搭建工具包
  • LeetCode Hot 100 - 盛水最多的容器解题思路详解
  • Windows驱动管理革命:Driver Store Explorer全面实战指南
  • Get-cookies.txt-LOCALLY:本地Cookie导出终极指南,隐私安全无忧
  • 云原生API网关认证终极指南:5步搞定Hydra+APISIX高可用集成
  • 文件哈希值批量修改新方案:告别传统计算的效率革命
  • Beyond Compare 5完整使用指南:三步实现免费授权
  • ComfyUI-Manager终极指南:一键配置AI绘画管理平台
  • 如何快速获取网盘文件真实下载地址?2025年最实用的网盘直链工具推荐
  • Redis过期键管理终极技巧:AnotherRedisDesktopManager可视化监控实战
  • 知识星球内容数字化归档:从信息流到结构化知识库的技术实践
  • NatTypeTester终极指南:3分钟快速诊断网络NAT类型,彻底解决游戏卡顿和视频会议延迟问题
  • Tsuru容器平台架构深度解析:企业级PaaS部署实战指南
  • GHelper终极指南:7步解锁华硕ROG笔记本隐藏性能
  • ACE-Step适配国产操作系统:推动开源音乐AI生态发展