
DP背包
文章平均质量分 56
Brightess
毕业于湖南城市学院
目前在某游戏大厂搬砖(
展开
-
poj 2184 Cow Exhibition(01背包经典变种 负数处理 两种写法)
poj 2184 Cow Exhibition(01背包经典变种 负数处理 两种写法)原创 2022-11-18 10:52:36 · 209 阅读 · 0 评论 -
AcWing 900. 整数划分(计数类dp or 完全背包求方案数)
题意:一个正整数 n 可以表示成若干个正整数之和,形如:n = n1 + n2 + ... + ng,其中 n1>n2>...> nk,k > 1。我们将这样的一种表示称为正整数 n 的一种划分。现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。解法一 计数dpf[i,j] 的状态表示:集合:所有总和是 i,并且恰好表示成 j 个数的和的方案属性:Countf[i,j] 的状态计算:我们以 “最小值是 1”、“最小值大于 1” 进行集合划分(不重不..原创 2022-03-30 21:25:10 · 542 阅读 · 2 评论 -
AcWing 1074. 二叉苹果树(有依赖的分组背包问题 树形dp)
AcWing 10. 有依赖的背包问题(树形dp + 分组背包)#include<bits/stdc++.h>using namespace std;const int N = 110, M = N<<1;int n, m;int h[N], e[M], ne[M], w[M], idx;int dp[N][N];void add(int a, int b, int c){ e[idx] = b, ne[idx] = h[a], w[idx] = c,..原创 2022-03-24 22:08:15 · 291 阅读 · 0 评论 -
AcWing 10. 有依赖的背包问题(树形dp + 分组背包)
题意每选择一个物品就应当选择其父节点,问所有选择方案能得到的最大价值是多少?思路一道 背包DP 的 变种题目根据题设的 拓扑结构 可以观察出每个 物品 的关系构成了一棵 树而以往的 背包DP 每个 物品 关系是 任意的(但我们一般视为 线性的)所以,这题沿用 背包DP 的话,要从原来的 线性DP 改成 树形DP 即可然后思考 树形DP 的 状态转移先比较一下以往 线性背包DP 的 状态转移,第 i 件 物品 只会依赖第 i−1 件 物品 的状态如果本题我们也采用该种 状态依赖关系 的...原创 2022-03-22 13:12:06 · 282 阅读 · 0 评论 -
AcWing 1019. 庆功会(多重背包模板题)
题意一共有 n 种奖品,m 元现金对于第 i 种奖品,其 价格 为 vi,价值 为 wi,数量 为si制定一个购买 方案,使得该方案的总价值 最大思路物品个数为 n,总体积为m,初步识别是一个 背包问题观察到每个物品有 数量限制,断定该题是 多重背包问题时间复杂度:O(nms)O(nms)O(nms)代码:一维写法#include<bits/stdc++.h>using namespace std;const int N = 6010;int dp[N];in..原创 2022-03-12 11:37:28 · 729 阅读 · 0 评论 -
AcWing 1020. 潜水员(二维费用01背包问题变形)
题目描述:一共有 k 种 物品(气缸),对于第 i 种物品,第一维 费用(氧气体积) 是 v1i,第二维 费用(氮气体积) 是 v2i,价值(气缸重量) 是 wi每个物品只能 被选一次求一个 选择方案,使得第一维费用 不少于 n,第二维费用 不少于 m 且 总价值最小思路:闫氏dp分析法:状态表示dp[i,j,k]:集合:所有从前i个物品中选,且氧气含量至少是j,氮气含量至少是k的所有选法属性:所有从前i个物品中选,且氧气含量至少是j,氮气含量至少是k的所有选法的气缸重量总和的最小值...原创 2022-03-11 21:45:43 · 411 阅读 · 0 评论 -
AcWing 8. 二维费用的背包问题
#include<bits/stdc++.h>using namespace std;const int N = 110;int n, v, m;int dp[N][N];int main(){ cin>>n>>v>>m; for(int i=1;i<=n;++i) { int vv, mm, ww; cin>>vv>>mm>>ww; ...原创 2022-03-08 22:50:01 · 154 阅读 · 0 评论 -
AcWing 1021. 货币系统(完全背包求取方案数量)
题意:给定 n 种面值的货币,每种货币可以选无数个问:组成面值为 m 的货币共有多少种方案思路:这是一道 完全背包求方案数 的裸题,分析思路与上一题 AcWing 278. 数字组合 完全一致一共有 n 个物品,每个物品有体积 vi,价值 wi,每个物品能够选无数次求总体积恰好为 m 的 方案数闫氏DP分析法初始状态:f[0][0] = 1(前0个物品选出总体积恰好是0的方案数,显然为1)目标状态:f[n][m](求前n个物品选出总体积恰好是m的方案数)注意本题方案数会爆 int ..原创 2022-03-08 22:09:15 · 316 阅读 · 0 评论 -
AcWing 278. 数字组合(01背包问题求取方案数)
题意:01背包求方案数思路:闫氏dp分析法注意:初始化的时候,dp[0][0]代表从前0个物品选出总体积恰好是0的方案数,显然为1,而dp[0][1]、dp[0][2]、dp[0][3]等代表从前0个物品中选出总体积恰好是i(i=1、2、3…)的方案数,显然是不存在的,所以置为0。时间复杂度:O(nm)二维朴素代码:#include<bits/stdc++.h>using namespace std;const int N = 110, M = 1e4+10;in..原创 2022-03-07 22:53:21 · 412 阅读 · 0 评论 -
AcWing 1022. 宠物小精灵之收服(二维费用的01背包问题)
题意:思路:本题是一道 01背包 的扩展题 —— 二维费用01背包问题,其本质和经典01背包没有区别把 野生小精灵 看做 物品,则将捕捉需要的 精灵球个数 定为 第一费用,皮卡丘要消耗的体力 定为 第二费用最后答案要求物品数量最多,因此我们可以用状态的属性来表示选择的物品数以上就是本题的 阅读理解 分析部分 ,接下来上 闫氏DP分析法:上图展示的是三维朴素,我们用代码实现的时候将省去第一维(野生小精灵数量),类比最经典的01背包问题注意,题目提到:①使得皮卡丘体力小于等于0的...原创 2022-03-07 22:04:08 · 616 阅读 · 0 评论 -
AcWing 1024. 装箱问题(01背包问题 两种思考方式)
一维优化:#include<bits/stdc++.h>using namespace std;const int N = 2e4+10;int n, v;int dp[N];int main(){ cin>>v>>n; for(int i=1;i<=n;++i) { int vv; cin>>vv; ..原创 2022-03-07 20:08:43 · 561 阅读 · 0 评论 -
AcWing 423. 采药(01背包加优化)
算法(DP,背包问题) O(nm)经典01背包问题。采药总时间相当于背包容量,每一株药相当于一件物品,采药时间相当于该物品的体积,草药的价值相当于物品价值。时间复杂度01背包问题的时间复杂度 等于 物品数量 × 背包容量,因此本题的时间复杂度是 O(nm)。本题使用一维优化01背包#include<bits/stdc++.h>using namespace std;int t, m;const int N = 1010;int v, w;int dp[N];..原创 2022-03-07 11:03:21 · 117 阅读 · 0 评论 -
HDU 3466 Proud Merchants(背包变式:贪心排序,01背包优化,背包的无后效性)2021-08-10
题意:有n件商品,每件商品的价格是pi,每件商品只有在总钱数大于等于qi时才可以买入,每件商品都有评估价值vi。现在共有M元钱,如何实现使买到的商品价值最大。分析题中的第二个例子:3 105 5…A商品3 6…B商品2 3…C商品输出的结果为11对于这个例子,正确的购买方法是先买A后买B(考虑到题目的附加要求提到只有钱数大于等于qi时才能够买入),这样就可以得到最大价值11,不能先B后A。所以,结果和购买的顺序有很大关系,但是如果qi=pi,那么结果跟顺序没有关系,那么此时就是典型的01背包原创 2021-08-10 22:28:00 · 189 阅读 · 0 评论 -
洛谷 p1616 疯狂的采药(完全背包优化)2021-08-11
题目背景此题为纪念 LiYuxiang 而生。题目描述LiYuxiang 是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如果你是 LiYuxiang,你能完成这个任务吗?.原创 2021-08-11 00:18:58 · 167 阅读 · 0 评论 -
HDU 1114 piggy banks(完全背包滚动数组,背包恰好装满) 2021-08-11
题目大意:给定一个猪存钱罐所能承受的最大硬币总质量,及N种硬币的货币单位和它的质量,要求通过各类硬币的组合(在恰好能达到存钱罐能承受的最大质量情况下)所能达到总价值的最小值。背包恰好装满求最大值:一维:dp数组初始化为-0x3f3f3f3f dp[0]=0dp[i]==-0x3f3f3f3f,说明不存在满足情况的maximum,dp[i]>-0x3f3f3f3f 说明存在。二维:dp[i][j]=-0x3f3f3f3f dp[i][0]=0背包恰好装满求最小值:一维:dp数组初原创 2021-08-11 16:43:57 · 133 阅读 · 0 评论 -
洛谷 p1853 投资效益 (背包容量变化的完全背包)2021-08-11
题目背景约翰先生获得了一大笔遗产,他暂时还用不上这一笔钱,他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券,每一种债券都能在固定的投资后,提供稳定的年利息。当然,每一种债券的投资额是不同的,一般来说,投资越大,收益也越大,而且,每一年还可以根据资金总额的增加,更换收益更大的债券。题目描述例如:有如下两种不同的债券:①投资额4000,年利息4000,年利息400;②投资额3000,年利息3000,年利息250。初始时,有10000的总资产,可以投资两份债券①债券,一年获得10000的.原创 2021-08-11 19:54:21 · 190 阅读 · 0 评论 -
HDU 1059 Dividing (多重背包二进制优化)2021-08-12
ProblemMarsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the co.原创 2021-08-12 16:01:58 · 184 阅读 · 0 评论 -
洛谷 p1776 宝物筛选(多重背包二进制优化--模板)2021-08-12
题目描述终于,破解了千年的难题。小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物。这下小 FF 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 FF 的采集车似乎装不下那么多宝物。看来小 FF只能含泪舍弃其中的一部分宝物了。小 FF 对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 FF有一个最大载重为 W 的采集车,洞穴里总共有 n 种宝物,每种宝物的价值为 vi,重量为 wi,每种宝物有 mi件。小 FF 希望在采集车.原创 2021-08-12 17:27:36 · 373 阅读 · 0 评论 -
HDU 1712 ACboy needs your help(分组背包入门题)2021-08-13
Problem DescriptionACboy has N courses this term, and he plans to spend at most M days on study.Of course,the profit he will gain fromdifferent course depending on the days he spend on it.How to arrange the M days for the N courses to maximize the profi.原创 2021-08-13 09:46:33 · 375 阅读 · 0 评论 -
AcWing 1252. 搭配购买(并查集维护01背包)
并查集维护01背包题意:思路:利用并查集把必须一起购买的_uinion一起,注意合并的时候要同时维护额外的价格和价值(v[],w[]),这两个额外的变量我们定义只对根节点有意义(p[x]==x的节点,这一点在合并代码和01背包代码中均有体现),之后将一个集合中的所有云朵看做一个物品,转化成经典的01背包问题。#include<bits/stdc++.h>using namespace std;int n, m, vol;const int N = 1e4+10;in...原创 2022-02-10 19:36:28 · 487 阅读 · 0 评论 -
01背包问题
01背包有 N 件物品和一个容量为 V 的背包,每件物品有各自的价值且只能被选择一次,要求在有限的背包容量下,装入的物品总价值最大。「0-1 背包」是较为简单的动态规划问题,也是其余背包问题的基础。动态规划是不断决策求最优解的过程,「0-1 背包」即是不断对第 i 个物品的做出决策,「0-1」正好代表不选与选两种决定。f[i][j] 状态表示:集合: 所有只从前i个物品中选,且总体积不超过j的选法的集合 ,属性 :最大价值maxf[i, j]状态计算:集合划分:划分依据:以第i个物品 选原创 2022-03-06 21:40:22 · 466 阅读 · 0 评论 -
完全背包问题
结合以下01背包的分析方式,我们也可以这样思考:优化思路我们列举一下更新次序的内部关系:f[i , j ] = max( f[i-1,j] , f[i-1,j-v]+w , f[i-1,j-2*v]+2*w , f[i-1,j-3*v]+3*w , .....)f[i , j-v]= max( f[i-1,j-v] , f[i-1,j-2*v] + w , f[i-1,j-3*v]+2*w , .....)由上两式,可得出如下递推关系:f[i][j]=max(f[i-1][j], f[i,j-原创 2022-03-06 22:51:19 · 205 阅读 · 0 评论 -
多重背包问题(朴素及二进制优化版)
朴素:[AcWing] 4. 多重背包问题 I(C++实现)多重背包问题 I模板题二进制优化:/*数据规模较大,如果按之前的朴素做法超时,应当优化*//*二进制优化,由于第i种物品有若干个,因此将每一种物品中的多个物品打包成一件新的物品,例如:第i种物品有200个,则打包成8份,第一份1个,第二份2个,第三份4个,依次8,16,32,64此时已经有127个了,还剩200-127=73个第i种物品*//*用若干份新的物品代替原来第i种物品,后枚举新的物品选or不选(01背包本质),就可拼凑出第i原创 2022-03-06 23:30:41 · 744 阅读 · 0 评论 -
分组背包问题
分组背包问题分析:转移方程:dp[i,j]=max(dp[i-1,j],dp[i-1,j-v[i,k]]+w[i,k])优化后:dp[j]=max(dp[j],dp[j-v[i,k]]+w[i,k])#include<bits/stdc++.h>using namespace std;const int N = 110;int v[N][N], w[N][N];int s[N];int dp[N];int n, m;int main(){ cin..原创 2022-03-07 10:33:47 · 282 阅读 · 0 评论