背包问题
SundayJerry
这个作者很懒,什么都没留下…
展开
-
P2170 选学霸(并查集 + 背包dp)
P2170 选学霸解法:我们可以把k对利用并查集链接起来,之后我们可以把每一个连通块当作一个背包的物品,因为题意求的是abs(选择的学霸 - m),我们的背包体积开成2 * m即可#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e5 + 100;int fa[maxn],d[maxn],a[maxn],dp[maxn];int find(int x){ if(x =原创 2021-10-17 21:30:23 · 113 阅读 · 0 评论 -
分组背包问题
Acwing 分组背包问题有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于其它背包,这个题目的分组背包就是对于一组物品我们只能进行选择一个,那么我们还是需要进行考虑当前有状态转移有几个维度,当然第一维度肯定是for(int i = 1; i <= n; i++)表示第几组物品,第二维度就是f原创 2021-10-16 22:55:43 · 253 阅读 · 0 评论 -
多重背包问题 II(二进制拆分技巧)
Acwing 多重背包问题 II有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。0< N <= 1000 0 < V <= 2000,0 < v,w,s<= 2000解法:看到第一眼N的范围是1000,物品个数0 < s <= 2000这样的话我们可以考虑合并,我们可以把多个相同物品合并成一个这样就能将问题转化成01原创 2021-10-16 22:44:36 · 236 阅读 · 0 评论 -
多重背包问题 I
Acwing 多重背包问题 I有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。1 <= N,V <= 100相较于完全背包和01背包, 多重背包的就是物品使用次数有限,我们可以考虑多一维表示当前物品的使用次数, 那么我们状态转移就有三维状态,第一维就是for(itn i = 1; i <= n; i++)表示当前是哪个物品,第二维与01背包相同就原创 2021-10-16 22:32:46 · 102 阅读 · 0 评论 -
完全背包问题
Acwing 背包题有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于01背包,完全背包的物品是无限件用的,那么我们只需要进行一个小改动,第一维还是for(int i = 1 ; i <= n; i++)第二维需要改变一下,就是从体积小的开始for(itn j = a[i].v; j <= V; j++)转移方程还是dp[j] = ma原创 2021-10-16 22:23:36 · 63 阅读 · 0 评论 -
01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大输出最大价值. 1 <= N,V <= 1000解法:经典01背包问题,由于N,V比较小我们可以直接采取N*V进行,第一维就是1-N表示物品,第二维for(int j = V; j >= a[i].v; j–),转移方程就是dp[j] = max(dp[j], dp[j - a[i].v] + a[i].w)即可原创 2021-10-16 22:17:34 · 67 阅读 · 0 评论