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

【背包dp】小结

背包问题总结

一、什么是背包问题?

定义:给定一个容量为 W 的背包和 n 件物品,每件物品有一个重量 w[i] 和价值 v[i],要求选择若干物品放入背包,在不超过容量的前提下,使总价值最大

背包问题本质是:约束优化 + 组合选择


二、什么时候考虑用“背包思想”?

你可以在如下类型的问题中尝试用背包建模:

题目特征关键词是否适合背包建模?
有一个资源上限(如时间、钱、容量)“最多”、“不超过”、“限制在…”资源即背包容量
有多个选项可选,每个选项有代价和收益“每个选择有花费和收益”、“从中选择一些”每个选项就是一个“物品”
要最大化或最小化一个目标值(如最大收益、最小时间)“求最大值/最小值”、“最优”属于优化问题
每个选项只能选一次/多次/无限次“可重复选”/“不可重复”可映射到 0-1、完全、多重背包
组合问题,多个变量之间的选择组合“在多个物品中挑选”用状态转移建模组合方式

一句话记忆
多个物品(选项),有一个资源限制,要做出最优组合决策,就可以考虑“背包思想”。


三、常见背包模型(及其差异)

类型是否可重复限制条件应用举例
0-1 背包每个物品最多选一次挑战任务只能做一次
完全背包是(无限)每个物品可选任意次硬币兑换、无限库存商品
多重背包是(有限)每个物品最多选 k 次有限库存下的选购问题
分组背包分组内最多选一个每组内只能选一个每种类别选一个代表
混合背包混合限制混合以上任意模型综合现实场景,如同时有限和无限物品
二维/多维背包多维限制除重量外还有其他限制同时限制时间/金钱等多种资源

四、状态表示 & 转移方程

通用思路

  • 状态定义:dp[i][j] 表示前 i 个物品中,容量为 j 时可获得的最大价值。

  • 状态转移:

    • 不选第 i 个物品dp[i][j] = dp[i-1][j]
    • 选第 i 个物品dp[i][j] = dp[i-1][j - w[i]] + v[i](要满足 j >= w[i]

状态压缩(降维优化)

因为 dp[i][*] 只依赖于 dp[i-1][*],所以可以使用一维数组。

各类背包的一维优化写法对比:

类型j 遍历顺序解释
0-1 背包for j from W down to w[i]倒序:防止多次选择同一物品
完全背包for j from w[i] to W正序:允许重复使用当前物品
多重背包(二进制拆分)拆成若干个 0-1 物品后处理防止超时

五、例题归类(每种类型都附带一个经典应用)

背包类型题目示例描述
0-1 背包经典最大价值问题n 件物品,每个选一次,背包容量为 W
完全背包硬币兑换无限数量的硬币组成目标金额
多重背包商品选购每种商品有库存限制
分组背包项目选择每类项目只能选一个,例如 CPU/显卡/内存 各选一个
混合背包商店打折组合有些商品有限,有些无限
二维背包同时限制金钱和时间如同时给出“时间限制”和“重量限制”

六、注意事项 & 常见错误

问题错误描述正确做法
遍历顺序写错完全背包使用倒序完全背包需正序遍历 j
状态转移写错忘了判断 j >= w[i]加上条件判断
多重背包暴力写法超时三重循环二进制拆分优化
使用二维数组时初始化错未初始化第 0 行初始化 dp[0][*] 为 0

七、总结口诀

背包问题口诀:

多个物品选几个,容量限制是核心;
选或不选看约束,价值最大找最优;
可重复用正序扫,只能选一次就倒流;
多重拆成 0-1 背,分组记得内部分组选。

http://www.xdnf.cn/news/7199.html

相关文章:

  • 20250518 黎曼在三维空间中总结的一维二维的规律,推广到高维度合适吗?有没有人提出反对意见
  • Power BI Desktop运算符和新建列
  • 职场方法论总结(3)-金字塔原理
  • Redis的持久化机制
  • 深入探索PointNet:点云处理的革命性算法
  • 【MySQL】02.数据库基础
  • 安装和升级到devExpress23.1.7
  • #Redis黑马点评#(七)实战篇完结
  • 2025 ISCC 练武赛Pwn-wp(含附件)
  • 知识图谱(KG)与大语言模型(LLM)
  • 《算法导论(第4版)》阅读笔记:p83-p85
  • buck变换器的simulink/matlab仿真和python参数设计
  • 互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
  • 进程概念及操作系统的知识点
  • 基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计
  • React方向:react的基本语法-数据渲染
  • 备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数
  • 【CF】Day61——Codeforces Round 939 (Div. 2) CD (思维构造 | 思维构造 + dfs枚举)
  • Python实例题:基于scrapy爬虫的天气数据采集
  • 构建 TypoView:一个富文本样式预览工具的全流程记录
  • 基于RDMA的跨节点GPU显存共享技术实践
  • Linux系统编程——system函数和popen函数的使用方法以及区别
  • ImgShrink:摄影暗房里的在线图片压缩工具开发记
  • C#里与嵌入式系统W5500网络通讯(2)
  • STM32SPI实战-Flash模板
  • 第6章 实战案例:基于 STEVAL-IDB011V1 板级 CI/CD 全流程
  • 深入解析Java事件监听机制与应用
  • std::is_same
  • LOF算法(局部异常因子)python实现代码
  • AI测试方法有哪些?