背包问题汇总

devtools/2024/11/13 5:32:07/

本文涉及知识点

动态规划汇总
状态机dp

01背包

有n件物品,体积分别是v[i],价值分别是w[i],有个包的容积是bv。如何选择物品使得,在总体积不超过vb的前提下,让总价值最大。

动态规划的状态表示

dp[i][j] 表示处理完前i件物品,占用体积是j的最大价值。
如果不用滚动向量,空间复杂度是O(n × \times ×bv)

动态规划的状态方程

如果选择选择标为i的物品:
MaxSelf(dp[i+1][j+v[i]] ,dp[i][j]+w[i])
如果不选择下标为i的物品:
MaxSelf(dp[i+1][j],dp[i][j])
转移方程的时间复杂度为O(1)
故总时间复杂度为:O(n × \times ×bv)

动态规划的初始状态

全为0。

动态规划的填表顺序

依次枚举各物品。

动态规划的返回值

dp.back()的最大值。

多重背包完全背包转化成01背包

多重背包:每件物品有多件n[i]。
完全背包:每件物品无限。
完全背包:我们可以把物品拆分1 + 2 + 4+ 8 + ⋯ \cdots 这样时间复杂是O(n × \times ×bv × \times × logmax)
多重背包假定某个物品有x件:
拆分成:1+2+4+8 + ⋯ \cdots + y
y = x - (1 + 2+4+8 ⋯ \cdots ) ,y > 0,y尽可能得小 。
我们来证明,这样可以选择:[0,x]
令y前面有i 项: 则通过选或不选前i项,范围为:[0,2i)
y < 2i
如果选择y,则范围为:[y,y+2i)
两者结合就是:[0,y+2i)
y+2i-1就是x,故可以表示[0,x]

完全背包

dp[i][j] = max(dp[i][j-v[i]]+w[i],dp[i-1][j])
分别对应两种情况:
一,选择物品i。只需要考虑选择一个,因为dp[i][j-v[i]] dp[i][j-v[i]*2] ⋯ \cdots 可能也选择了一个。
二,不选择物品i。
时间复杂度为:O(n × \times ×bv)

单调双向队列及多重背包

for(int j1 = 0 ; j1 < v[i];j1++)
for(int j = j1; j <= bv; j+= j1 ){
⋯ \cdots
}
队列que中记录如下数据:{pre[j1],pre[j1+v[i]]-w[i],pre[j1+(v[i]-v[i])*2 ⋯ \cdots }
max(que)+ ( j- j1)/v[i] *w[i] 就是dp[i][j]。
问题一:
( j- j1)/v[i] > n[i] ,就需要队首出队,直到 ( j- j1)/v[i] == n[i]。
问题二,如何求最大值:
前面的数据先出队,如果前面的数据小于等于后面的数据,则前面的数据被淘汰了。
数据淘汰后,队列的数据降序,也就是队首数据最大。

例题

背包
定界01背包
【动态规划】879. 盈利计划
完全背包
【动态规划】【C++算法】2188. 完成比赛的最少时间
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
类似多重背包
【动态规划】【同余前缀和】【多重背包】2902. 和带限制的子多重集合的数目

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/devtools/14368.html

相关文章

安全狗云眼的主要功能有哪些?

"安全狗云眼"是一款综合性的网络安全产品&#xff0c;主要用于实时监控和保护企业的网络安全。其核心功能包括威胁检测、漏洞扫描、日志管理和合规性检查等。 以下是安全狗云眼的主要功能详细介绍&#xff1a; 1、资产管理 定期获取并记录主机上的Web站点、Web容器、…

spring security登录认证授权

spring security登录认证授权 是什么 Spring Security 主要实现了Authentication&#xff08;认证&#xff0c;解决who are you? &#xff09; 和 Access Control&#xff08;访问控制&#xff0c;也就是what are you allowed to do&#xff1f;&#xff0c;也称为Authorizat…

Linux :vim ,gcc ,makefile 三件套之vim的基本使用

vim &#xff0c;gcc &#xff0c;makefile 三件套 一&#xff0c;vim ​ vim 是 Linux 系统上的最著名的文本/代码编辑器&#xff0c;也是早年的 Vi 编辑器的加强版&#xff0c;而 gVim 则是其 Windows 版。它的最大特色是完全使用键盘命令进行编辑&#xff0c;脱离了鼠标操…

探索Web3:去中心化的互联网新时代

引言 在过去的几十年里&#xff0c;互联网已经改变了我们的生活方式、商业模式以及社交互动方式。然而&#xff0c;一个新的技术浪潮——Web3正在崭露头角&#xff0c;预示着一个去中心化的互联网新时代的来临。本文将深入探讨Web3技术的定义、特点以及其对未来互联网发展的影…

Java面试之JDK、JRE、JVM区别

1、JDK&#xff08;Java Development Kit&#xff09;&#xff1a; JDK是Java开发工具包&#xff0c;它是开发Java应用程序的核心工具。它包含了编译器&#xff08;javac&#xff09;、运行时库&#xff08;Java标准库&#xff09;、调试器&#xff08;jdb&#xff09;等工具&…

eCharts 折线图 一段是实线,一段是虚线的实现效果

在lineStyle里写了不生效的话&#xff0c;可以尝试数据拼接 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224,218 ,,,],type: line},{data: [,,, 218, 135, 147, 260],type: line,lineStyl…

Linux 底软开发——对CAN的详细操作(周期发送,异常检测,过滤报文)

Linux底软开发—对CAN发送接收详细操作 文章目录 Linux底软开发—对CAN发送接收详细操作1.保证多条CAN数据发送的周期性2.解析CAN报文数据3.CAN总线异常机制应对4.对CAN报文进行过滤操作5.完整的接收报文代码&#xff08;过滤&#xff0c;心跳检测&#xff0c;解析&#xff09;…

热搜关键词与你息息相关

以下是20个可能的百度搜索关键词&#xff0c;以及它们的解析&#xff1a; 科技创新&#xff1a;用户搜索以了解最新的科技进展和创新项目。 解析&#xff1a;该关键词反映了用户对科技进步和创新成果的关注和追求。 健康生活&#xff1a;搜索健康饮食、运动等生活方式。 解…