[算法学习笔记] [算法总结] dp背包模型
前言
dp背包模型属dp的一种,可以帮助我们快速的转移状态,解题。dp背包模型题的关键是判断这是哪种背包,属于什么类型的dp,只有判断出这是什么类型的背包,才能进一步朝这个方向思考。
01背包
01背包的常规形式是有\(n\)种物品,每间物品都有重量和价值两个参数。每件物品都可以选or不选,有一个限重为\(W\)的背包,求背包内价值最大。
从这个基本模型可以看出01背包一般是解决选或不选的问题,直接应用该模型的有 Luogu P2340 [USACO03FALL] Cow Exhibition G一题。本题种奶牛可以选or不选,有EQ和IQ两个参数,乍看可能无法转移,但是我们要尽可能朝01背包上思考。我们发现EQ+IQ=题目所求的价值。因此我们可以不存价值,dp数组中只存EQ和IQ(当然谁转移到谁无所谓)
当题目很复杂难以直接看出时,先简化题意,看出这是哪种背包模型,然后朝着这种背包模型上靠拢。如果一步难以直接推出优化后的转移方程,可以先列出复杂的状态,确保状态正确的前提下再考虑优化。(这一步非常重要,一定要在确保dp式正确的前提下考虑优化)
完全背包
完全背包一般是每种物品有无限个,求价值最大。
需要注意在所有背包普通模型中,只有完全背包是正着搜背包容量的,因为只有完全背包每种物品才可以无限选(这里将多重背包拆分成01背包解决),这里首先明确。
完全背包可以解决投资类问题,例如P1853投资的最大效益,初始手里有的钱可以当作背包容量,由于允许当天买当天卖,故我们每种债券都可以第一天买,第二天早上接着卖掉,第二天下午再买回来...由于这种特性我们认为每一天都是独立的,都要尽可能的使第二天早上钱更多。所以可以当作完全背包问题,只不过到了第二天下午背包容量需要变成第二天早上的价钱,背包容量动态改变,需要注意。
和P1853类似的还有纪念品一题,只不过一件物品每天的价格不一样,在列状态转移方程的时候不要搞混第一天和第二天上午的。
多重背包
多重背包和完全背包很类似,也是应用最多的。和完全背包相同的是每种物品可以有很多,不同的是每种物品有有限个,因此一般将其拆成01背包进行解决。
在拆分成01背包解决的时候,我们可以使用二进制拆分的方式拆分,简要来说就是利用了任何正整数都可以被分解为2的整次幂的性质。拆分成二的整次幂组,如果最后不能拆成完整的一组二的整次幂就直接作为一组即可。
混合背包
混合背包就是可以将01背包,完全背包,多重背包混合在一起,乍看可能无所下手,实际上只需要判断出这是什么背包分别套板子即可。
例题:樱花
分组背包
分组背包就是把背包分成了好几组,一般来说只需要每一组分开做01背包即可。
分组背包基本例题:Luogu P1757 通天之分组背包,需要注意枚举顺序,和普通的01背包不同的是本题每组之间互相矛盾,即每组内只能选一件物品。因此枚举顺序需要先枚举重量,再枚举每件物品。不能先枚举物品因为并不是每件物品都要选。
分组背包的变形很多,例如:BJOI2019 排兵布阵,本题乍看是一个分组背包,但是本题每组可以打多个城堡。我们注意到一个性质就是如果城堡编号\(i<j\)且城堡分别派兵数\(a_i<a_j\),那么如果\(j\)城堡能被攻打,\(i\)城堡显然也一定。所以在统计答案的时候别忘了加上前面的。其余做01背包即可。需要注意枚举顺序,我们这样处理实际上还是每组只能选一个打,和P1757一样,只不过统计答案的时候加上了前面的。因此枚举顺序需要先枚举重量,再枚举物品。和普通的01背包不一样的是我们每组只能选一件物品。
背包和计数dp
很多时候计数dp可以借鉴背包的做法,例如给定一堆数,求这堆数能凑出几个数。我们可以没添加一个数,就从这个数往后搜到边界,因为这个数只能改变和比她大的数字,统计个数即可,这里就借鉴了背包的思想。
上述内容有一个典型例题:P1832,本题就是判断一个数是不是质数,如果是则更新比她大的数。
同理,砝码称重,应该属于多重背包,但是本质还是一个计数dp。
遇到一个题,首先的判断出是一个dp,然后看看是不是可以用背包模型来解决?如果是判断是哪种背包模型,看看本题和所属的背包模型的状态转移方程有什么关系,注意不要光考虑背包,要与dp相结合。
本文作者:SXqwq,转载请注明原文链接:https://www.cnblogs.com/SXqwq/p/17604463.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!