【背包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.mzph.cn/diannao/83661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知

电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型(导引与非导引) 导引传输介质,如电缆、光纤; 非导引传输介质,如无线电波; 传输介质的选择影响信号传输质量 信号传输模式(单工…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

upload-labs通关笔记-第8关 文件上传之点绕过

目录 一、点绕过原理 二、deldot()函数 三、源码分析 四、渗透实战 1、构建脚本test8.php 2、打开靶场 3、bp开启拦截 4、点击上传 5、bp拦截 6、后缀名增加点 7、发包并获取脚本地址 8、访问脚本 本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗…

Spring Web MVC————入门(3)

今天我们来一个大练习,我们要实现一个登录界面,登录进去了先获取到登录人信息,可以选择计算器和留言板两个功能,另外我们是学后端的,对于前端我们会些基础的就行了,知道ajax怎么用,知道怎么关联…

PhpStudy | PhpStudy 工具安装 —— Windows 系统安装 PhpStudy

🌟想了解这个工具的其它相关笔记?看看这个:[网安工具] 服务器环境配置工具 —— PhpStudy 使用手册 笔者备注:Windows 中安装 PhpStudy 属于傻瓜式安装,本文只是为了体系完善而发。 在前面的章节中,笔者简…

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考:K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…

通俗解释Transformer在处理序列问题高效的原因(个人理解)

Transformer出现的背景 CNN 的全局关联缺陷卷积神经网络(CNN)通过多层堆叠扩大感受野,但在自然语言处理中存在本质局限: 局部操作的语义割裂:每个卷积核仅处理固定窗口(如 3-5 词),…

Java 多线程基础:Thread 类核心用法详解

一、线程创建 1. 继承 Thread 类(传统写法) class MyThread extends Thread { Override public void run() { System.out.println("线程执行"); } } // 使用示例 MyThread t new MyThread(); t.start(); 缺点:Java 单…

Django 中时区的理解

背景 设置时区为北京时间 TIME_ZONE ‘Asia/Shanghai’ # 启用时区支持 USE_TZ True 这样设置的作用 前端 (实际上前端el-date-picker 显示的是当地时区的时间) Element组件转换后,我们是东八区,前端传给后端的时间为&…

C# 深入理解类(成员常量)

成员常量 成员常量类似前一章所述的局部常量,只是它们被声明在类声明中而不是方法内,如下面的 示例: 与局部常量类似,用于初始化成员肯量的值在编译时必须是可计算的,而且通常是一个预定 义简单类型或由它们组成的表达…

【深度学习】#12 计算机视觉

主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李沐学AI 目录 目标检测锚框交并比(IoU)锚框标注真实边界框分配偏移量计算损失函数 非极大值抑制预测 多尺度目标检测单发多框检测(S…

MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频

扣子最近迎来重要更新,支持将扣子工作流一键发布成MCP,在扣子空间里使用。 这个功能非常有用,因为我有很多业务工作流是在扣子平台上做的,两者打通之后,就可以在扣子空间里直接通过对话方式调用扣子工作流了&#xff0…

Redis学习打卡-Day3-分布式ID生成策略、分布式锁

分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时,就需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…

LabVIEW光谱信号仿真与数据处理

在光谱分析领域,LabVIEW 凭借其图形化编程、丰富函数库及强大数据处理能力,成为高效工具。本案例将介绍如何利用 LabVIEW 仿真光谱信号,并对实际采集的光谱数据进行处理,涵盖信号生成、数据采集、滤波、分析及显示等环节。 ​ 一…

nginx相关面试题30道

一、基础概念与核心特性 1. 什么是 Nginx?它的主要用途有哪些? 答案: Nginx 是一款高性能的开源 Web 服务器、反向代理服务器及负载均衡器,基于事件驱动的异步非阻塞架构,擅长处理高并发场景。 主要用途:…

数据库实验报告 数据定义操作 3

实验报告(第3次) 实验名称 数据定义操作 实验时间 10月12日1-2节 一、实验内容 1、本次实验是用sql语句创建库和表,语句是固定的,要求熟记这些sql语句。 二、源程序及主…

霍夫圆变换全面解析(OpenCV)

文章目录 一、霍夫圆变换基础1.1 霍夫圆变换概述1.2 圆的数学表达与参数化 二、霍夫圆变换算法实现2.1 标准霍夫圆变换算法流程2.2 参数空间的表示与优化 三、关键参数解析3.1 OpenCV中的HoughCircles参数3.2 参数调优策略 四、Python与OpenCV实现参考4.1 基本实现代码4.2 改进…

记录一次修改nacos安全问题导致服务调用出现404

1、nacos默认值修改 nacos.core.auth.plugin.nacos.token.secret.key**** nacos.core.auth.server.identity.key******** nacos.core.auth.server.identity.value************ 重启nacos, 这时候微服务的token认证会立即失效,等待自动重连认证或者手动重启服务 2、…

Python面试总结

hello,大家好,我是potato,我总结一下最近的面试遇到的问题~ 1.Python开发(软通动力) 自我介绍主要问了项目(YOLOv11)项目遇到的难点和解决方法is,列表和元组的区别Python多线程有什么问题?Pyt…

5.18 day24

知识点回顾: 元组可迭代对象os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。 元组 元组的特点: 有序,可以重复,这一点和列表一样 元组中的元素不能修改,这一点…