![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
背包
文章平均质量分 64
相关总结及OJ练习
Ypuyu
Ypuyu
展开
-
[背包] 背包问题算法模板(模板)
文章目录0. 前言1. 01背包2. 完全背包3. 多重背包4. 分组背包0. 前言背包问题是众多 dp 问题的母题,是一个很重要的知识点。该博文基于背包九讲总结,会将背包九讲内容及模板题全部总结一般,也是鉴于学习进度,目前仅总结了 01 背包及优化模型,完全背包,多重背包,分组背包。初次系统学习背包问题,总结不够到位,往各位同学批评指正!十分感谢~背包问题共性:n 个物品,一个容量为 v 的背包每个物品两个属性,体积 vi,价值 wi要求在这些物品中挑总体积不大于 v 的物品并使背包装入原创 2020-11-09 18:40:33 · 2273 阅读 · 1 评论 -
[H背包] lc1449. 数位成本和为目标值的最大数字(背包求具体方案+状态定义+边界情况)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1449. 数位成本和为目标值的最大数字相关:[背包] 背包问题算法模板(模板)本题模型 [01背包] 背包问题求具体方案(01背包+求方案数+思维)2. 题目解析完全背包求具体方案的问题,是 [01背包] 背包问题求具体方案(01背包+求方案数+思维) 的变种。首先如果要使满足要求的拼的数最大,有两个要求:位数尽量大位数相同,字典序最大有限制的组合问题求最优解,一般会对应到背包问题。 在此就是从 1~9 中选,要求花费原创 2021-06-12 10:09:58 · 56 阅读 · 0 评论 -
[H背包] lc879. 盈利计划(二维费用背包+难题+状态定义)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:879. 盈利计划相关:[背包] 背包问题算法模板(模板)[01背包] 潜水员(01背包+二维费用背包+思维)2. 题目解析将问题抽象成二维费用背包求方案数是最难的。抽象完了还有状态定义、初始化、三维变二维的细节需要考虑。本题在第三维状态定义中使用了 >= 这个定义,这个就牵扯到负数下标问题,因为 >=-1 也会包含有正确情况,也得进行状态转移。具体看手写笔记:时间复杂度:O(n3)O(n^3)O(n3)空间原创 2021-06-09 01:08:52 · 935 阅读 · 8 评论 -
[M背包] lc1049. 最后一块石头的重量 II(01背包+知识理解+好题+思维)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:1049. 最后一块石头的重量 II2. 题目解析好难的一道 01 背包变种题…一开始还以为是选相邻石头,误判为 区间 dp…题目描述中有点误导人的意思,不需要限定 x<=y 才做后两种操作,直接可以任选两个石头 x、y,合并后新石头重量为 abs(x-y) 即可,当新石头质量为 0 时,则不再进入石头堆了。那么抽象的来想一下,每次合并过程其实就是针对两个石头选择正负号的过程,一直到最后的合并,也是两个石头选择正负号的过程。那么此时,原创 2021-06-08 02:56:09 · 104 阅读 · 0 评论 -
[M背包] lc494. 目标和(暴力dfs+01背包)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:5778. 使二进制字符串字符交替的最少反转次数2. 题目解析贪心题。很麻烦的一道题…没啥思路。能知道从原串转化到 01 或 10 相间的串,与从 01 或 10 相间的串转化到原串,所用的类型 2 操作应该是一致的。故,我们可以考虑如何将一个 01 相间的串转化为原串,其中类型1 操作可以任意使用,保证类型2 操作最少。那么针对原串长度为偶数情况来讲,类型 1 操作不论做多少次,都只会构成 010101...01 或 101010.原创 2021-06-07 01:40:42 · 119 阅读 · 1 评论 -
[M背包] lc474. 一和零(二维费用背包+好题)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:474. 一和零相关:[背包] 背包问题算法模板(模板)2. 题目解析二维费用背包的应用。本题终究还是一个选不选问题,那么这种有限制的选择问题,说了无数遍了,它就是一个背包问题。将每个字符串都看作物品,其中 0 的个数就是重量,1 的个数就是体积,价值就是 1 。重量限制、体积限制就是 m、n。二维费用背包同 01 背包优化掉第一维一样,同时体积、重量都需要从大到小进行枚举。时间复杂度:O(n2m)O(n^2m)O(n2m)空间复原创 2021-06-06 10:04:34 · 96 阅读 · 0 评论 -
[dfs] aw3481. 阶乘的和(dfs+二进制枚举+01背包+常见问题+错误记录)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:3481. 阶乘的和2. 题目解析阶乘增长速度很快,9!=362880,0!=1,所以其实就是前 10 个数只能选 1 次,能否凑出 n 的问题。也就是枚举这 10 个数的子集。二进制枚举,dfs,01 背包均可。代码:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int原创 2021-05-16 21:51:38 · 107 阅读 · 0 评论 -
[01背包] 数字组合(01背包+求方案数)
文章目录0. 前言1. 01背包求方案数0. 前言相关:[背包] 背包问题算法模板(模板)1. 01背包求方案数278. 数字组合将 M 看作背包容量,每个数看成一个物品,Ai 看成是体积。本题即转化为:求出总体积恰好是 M 的方案数。思路:状态表示:f[i,j]:所有只从前 i 个物品中选,且总体积不超过 j 的方案的数量状态计算:和 01 背包一致,根据最后一步第 i 个物品选还是不选分类不包含物品 i 的所有选法:f[i][j] = f[i-1][j]原创 2020-11-21 17:08:05 · 2145 阅读 · 0 评论 -
[M背包] lc322. 零钱兑换(dp基础+知识理解+完全背包)
文章目录1. 题目来源2. 题目解析1. 题目来源链接:322. 零钱兑换相关链接:[背包] 背包问题算法模板(模板)2. 题目解析一道裸的完全背包问题,将硬币面额看作体积,价值为 1,背包容量为总金额,求体积为 amount 最少价值即可。在此使用了完全背包的一维优化,注意体积从小到大循环,这是与其它背包问题优化的不同之处!注意点:在此求的是最小价值,也就是凑出背包容量 j 的最少硬币数量,f[amount] 即为答案。完全背包模板是求最大价值,在此两者是等价转换,只是将整个的状态定义发生原创 2021-05-06 18:32:46 · 154 阅读 · 0 评论 -
[贪心+01背包] 能量石(01背包+贪心)
文章目录0. 前言1. 完全背包+求方案数+思维0. 前言相关:[背包] 背包问题算法模板(模板)01 背包调整法证明贪心问题:[贪心] 耍杂技的牛(公式推导+贪心)相关题目:114. 国王游戏1. 完全背包+求方案数+思维734. 能量石参考题解:mrk:重点参考题解辰风:能量石 十分清晰!!!!重点: 贪心证明、01 背包、思维、Google Kickstart2019 Round B Problem B贪心证明:暴力来做的话,就得枚举所有能原创 2020-11-24 17:42:05 · 279 阅读 · 0 评论 -
[01背包] 背包问题求方案数(01背包+求方案数+求最优解方案数+思维)
文章目录0. 前言1. 01背包+求方案数+思维0. 前言相关:[背包] 背包问题算法模板(模板)强相关:[01背包] 背包问题求具体方案(01背包+求方案数+思维)1. 01背包+求方案数+思维11. 背包问题求方案数本问题和 [01背包] 背包问题求具体方案(01背包+求方案数+思维) 求方案数不同。上个问题是求一条具体的最短路状态转移方案即可,因为会对字典序排序,所以当时我们采用了贪心的策略,当两个状态相等时,选小不选大。而本问题,这两个状态相等时,就把这两个都选上就行了。原创 2020-11-24 17:31:10 · 953 阅读 · 1 评论 -
[01背包] 背包问题求方案数(01背包+求方案数+思维)
文章目录0. 前言1. 01背包+求方案数+思维0. 前言相关:[背包] 背包问题算法模板(模板)强相关:[01背包] 背包问题求具体方案(01背包+求方案数+思维)1. 01背包+求方案数+思维11. 背包问题求方案数本问题和 [01背包] 背包问题求具体方案(01背包+求方案数+思维) 求方案数不同。上个问题是求一条具体的最短路状态转移方案即可,因为会对字典序排序,所以当时我们采用了贪心的策略,当两个状态相等时,选小不选大。而本问题,这两个状态相等时,就把这两个都选上就行了。原创 2020-11-23 21:38:02 · 1894 阅读 · 1 评论 -
[完全背包] 货币系统(完全背包+求方案数)
文章目录0. 前言1. 完全背包+求方案数+思维0. 前言相关:[背包] 背包问题算法模板(模板)强相关:[完全背包] 买书(完全背包+裸题)[完全背包] 货币系统(完全背包+求方案数)1. 完全背包+求方案数+思维1021. 货币系统重点: 完全背包、求方案数、思维、NOIP2018 提高组理解题意:给定一个集合 a,元素均为正整数。可以使用这些元素线性表出其它更大的元素集合求解一个集合 b,元素任意,要求其线性表出的元素必须与 a 集合线性表出的元素一样。输出这个集原创 2020-11-23 15:49:28 · 297 阅读 · 0 评论 -
[完全背包] 货币系统(完全背包+求方案数)
文章目录0. 前言1. 完全背包+求方案数0. 前言相关:[背包] 背包问题算法模板(模板)强相关:[完全背包] 买书(完全背包+裸题)1. 完全背包+求方案数1021. 货币系统重点: 完全背包、求方案数和 [完全背包] 买书(完全背包+裸题) 一模一样。就注意下初始化 f[0]=1,优化到一维时,完全背包问题体积从小到大进行枚举即可。代码:#include <iostream>using namespace std;typedef long long原创 2020-11-23 14:22:20 · 311 阅读 · 0 评论 -
[分组背包] 金明的预算方案(分组背包+二进制枚举+有依赖背包+思维)
文章目录0. 前言1. 分组背包+二进制枚举+思维0. 前言相关:[背包] 背包问题算法模板(模板)1. 分组背包+二进制枚举+思维487. 金明的预算方案重点: 分组背包、问题转化、NOIP 提高组 2006图上已经很清楚了,代码也做了详细注释,只要抽象到分组背包,这题就解决一大半了。注意输入的组织和处理,以及采用的二进制枚举还是很方便的。详细步骤代码:#include <iostream>#include <algorithm>#include &原创 2020-11-22 23:26:30 · 268 阅读 · 0 评论 -
[分组背包] 机器分配(分组背包+求方案数)
文章目录0. 前言1. 分组背包+求方案数0. 前言相关:[背包] 背包问题算法模板(模板)1. 分组背包+求方案数1013. 机器分配重点: 分组背包、求方案数注意:其实是分组背包的简单应用题,只不过输出路径我真的很不熟练…将每个公司看成一个组,每个公司组内分配不同的机器看作物品,所分配的该机器数量决定了它的价值状态表示:f[i][j]:从第 i 个公司中选,设备数量不超过 j 的方案的最大价值状态转移方程:f[i][j]=max(f[i-1][j], f[i-1原创 2020-11-22 22:05:32 · 643 阅读 · 0 评论 -
[01背包] 背包问题求具体方案(01背包+求方案数+思维)
文章目录0. 前言1. 01背包+求方案数+思维0. 前言相关:[背包] 背包问题算法模板(模板)1. 01背包+求方案数+思维12. 背包问题求具体方案求方案数也是背包问题、dp 的一大考点。本题仅以 01 背包为例。其实所有的 dp 问题都可以求出来状态转移的具体方案。所有的状态构成图,针对于 min 转移的话,其实就是求最短路路径,针对 max 转移的话,其实就是求最长路路径。状态转移方程为 f[i][j] = max(f[i-1][j], f[i-1][j-vi]+wi),其实就原创 2020-11-22 19:56:15 · 3032 阅读 · 0 评论 -
[01背包] 潜水员(01背包+二维费用背包+思维)
文章目录0. 前言1. 完全背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 完全背包裸题1023. 买书完全背包问题: f[i][j]=max(f[i-1][j], f[i][j-v]+w),这个是经典的完全背包优化。优化到一维以后体积是从小到大顺序枚举的,这是与 01 背包很不同的一个地方。一维代码:#include <iostream>#include <algorithm>using namespace std;const int原创 2020-11-22 17:42:20 · 172 阅读 · 0 评论 -
[完全背包] 买书(完全背包+裸题)
文章目录0. 前言1. 完全背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 完全背包裸题1023. 买书完全背包问题: f[i][j]=max(f[i-1][j], f[i][j-v]+w),这个是经典的完全背包优化。优化到一维以后体积是从小到大顺序枚举的,这是与 01 背包很不同的一个地方。一维代码:#include <iostream>#include <algorithm>using namespace std;const int原创 2020-11-21 19:12:07 · 261 阅读 · 0 评论 -
[多重背包] 庆功会(多重背包+裸题)
文章目录0. 前言1. 多重背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 多重背包裸题1019. 庆功会多重背包裸题,在此分析下时间复杂度即可。计算量 n*m*s 为 3e7 的计算量,朴素的多重背包就能过了一维代码:#include <iostream>#include <algorithm>using namespace std;const int N = 6005;int n, m;int f[N];int ma原创 2020-11-21 17:46:32 · 129 阅读 · 0 评论 -
[01背包] 宠物小精灵之收服(01背包+二维费用背包+思维)
文章目录0. 前言1. 01背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 01背包裸题1022. 宠物小精灵之收服每个精灵直被收服一次,故可以考虑 01 背包。思路:进行 01 背包转化,在此有两个体积和一个价值花费1:精灵球数量花费2:皮卡丘体力值价值:小精灵的数量。每个小精灵价值为 1状态表示:f[i,j,k]:所有只从前 i 个物品中选,且花费 1 不超过 j,花费 2 不超过 k 的最大价值状态计算:根据最后一步第 i 个物品选原创 2020-11-21 15:06:03 · 181 阅读 · 0 评论 -
[01背包] 装箱问题(01背包+裸题)
文章目录0. 前言1. 01背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 01背包裸题1024. 装箱问题裸题。体积当做价值来用,最少剩余容量等于最大利用体积(价值),最后记得得相减。时间复杂度为背包数量 * 物品数量,O(nm)O(nm)O(nm)。代码:#include <iostream>#include <algorithm>using namespace std;const int N = 2e4+5;int n, m原创 2020-11-20 17:44:49 · 208 阅读 · 0 评论 -
[01背包] 采药(01背包+裸题)
文章目录0. 前言1. 01背包裸题0. 前言相关:[背包] 背包问题算法模板(模板)1. 01背包裸题特点:每件物品最多只用一次423. 采药裸题。时间复杂度为背包数量 * 物品数量,O(nm)O(nm)O(nm)。代码:#include <iostream>#include <algorithm>using namespace std;const int N = 1005;int n, m;int v[N], w[N];int f[原创 2020-11-20 17:19:18 · 120 阅读 · 0 评论