随笔分类 -  动态规划--背包九讲

摘要: 阅读全文
posted @ 2020-03-23 19:37 _Ackerman 阅读(318) 评论(0) 推荐(0)
摘要:题目大意: 有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。数据范围:1 <= T <= 50 , 1 <= N <= 50(怪物数量), 1 <= Ti <= 阅读全文
posted @ 2020-02-05 23:04 _Ackerman 阅读(703) 评论(0) 推荐(1)
摘要:题目大意:有 n 组任务,m 个体力,每组任务有 k 个,分类为 f,每个任务花费 x 体力,得到 y 开心值,求最大开心值,若不能完成输出-1 分类为 0:这一组中的 k 个任务至少选择一个。 分类为 1:这一组中的 k 个任务最多选择一个。 分类为 2:这一组中的 k 个任务随便选择。 解法: 阅读全文
posted @ 2020-02-05 22:47 _Ackerman 阅读(378) 评论(0) 推荐(1)
摘要:对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂度上多一个系数K。 其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。 首先看01背包求最优解的状态转移 阅读全文
posted @ 2020-02-05 18:53 _Ackerman 阅读(313) 评论(0) 推荐(0)
摘要:Problem Description最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验 阅读全文
posted @ 2020-02-05 18:36 _Ackerman 阅读(345) 评论(0) 推荐(1)
摘要:题目大意: 一个人去买鞋,有k种牌子,每种牌子至少买一双鞋子。每双鞋子有标价跟实际价值。求用m多的钱买最多价值的鞋。 n: 物品总数 ,m: 钱数, K: 牌子数 ,描述 s:牌号 , v:标价, w:价值 解法: 首先看到题目很容易感觉得到这像是一个分组背包,但是又有点不一样。因为分组背包我们对于 阅读全文
posted @ 2020-02-05 18:21 _Ackerman 阅读(352) 评论(0) 推荐(0)
摘要:题目大意: 给你一些物品,每个物品有自己的花费和价值,每个物品 都有相对应的箱子, 如果你想要买这个物品,你就需要先买这个箱子(依赖),求 n个箱子花费 t 能获得的最大价值 思路: dp[i][j] 代表在 i 个箱子花费 j 能获得的最大价值 我们需要优先对箱子进行处理,处理完之后其他的都和 0 阅读全文
posted @ 2020-02-05 17:31 _Ackerman 阅读(761) 评论(0) 推荐(0)
摘要:题目大意: 给你一些钱 m ,然后在这个国家买东西, 共有 n 件物品,每件物品有 价格 P 价值 V 还有一个很特别的属性 Q, Q 指 你如过想买这件物品 你的手中至少有这钱Q 。 虽然你只要花费 钱P ,但你的手中至少有钱Q,如果不足Q ,不能买。问给你钱M ,列出N件物品,最多能获得多少价值 阅读全文
posted @ 2020-02-05 17:20 _Ackerman 阅读(342) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 问题描述: Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买 阅读全文
posted @ 2020-02-02 19:11 _Ackerman 阅读(272) 评论(0) 推荐(0)
摘要:问题描述: 解法: 因为求具体的方案,我们就不能采取之前滚动数组优化版本的 01背包 ,因为这样会损失一些具体方案 因为要求字典序最小,那么我们肯定采取贪心策略(能选序号小的就选序号小的) 我们如果从前往后遍历所有的物品,那么最后 dp[n][m] 就是最后答案,那我们就得从后往前遍历才可以求的具体 阅读全文
posted @ 2020-02-02 16:50 _Ackerman 阅读(751) 评论(1) 推荐(2)
摘要:问题描述: 解法: 我们让 dp[i] 代表 背包体积恰好为 i 时背包的最大价值 ,再定义一个 g[i] 代表体积为 i 的时候总价值最大的最优选法方案数 这里注意 dp 的含义与之前的 01背包有点不同,所以我们初始化的时候也需要注意 (具体的可以看之前 01背包详讲) 统计方案数的时候得看它是 阅读全文
posted @ 2020-02-02 16:45 _Ackerman 阅读(799) 评论(0) 推荐(0)
摘要:问题描述: 解法: 这种树形的结构我们首先很容易去想到 树形dp ,但是和 树形dp 不一样的地方在于它选一个节点的话还有附加条件(也就是依赖关系) 我们对于每一个节点可以把它看成一个分组背包 dp[i][j] 代表 选第 i 个节点 背包容量为 j 的时候 背包的最大价值 我们可以先采取 树形dp 阅读全文
posted @ 2020-02-02 16:33 _Ackerman 阅读(306) 评论(0) 推荐(0)
摘要:问题描述: 解法: 这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。 这样就可以对每一组转化为 01背包问题 int dp[110],v[110],w[110]; int main() { int n,m; cin >> n >> m; for (int i = 0;i < 阅读全文
posted @ 2020-02-01 22:59 _Ackerman 阅读(259) 评论(0) 推荐(0)
摘要:问题描述: 解法: 其实只需要在 01背包 的基础上再增加一个纬度代表重量就可以了 因为是在 01背包 的基础上,所以更新的话我们和 01背包一样从大往小更新 int dp[1010][1010]; int main() { int n,m,v; std::cin >> n >> v >> m; f 阅读全文
posted @ 2020-02-01 22:55 _Ackerman 阅读(217) 评论(0) 推荐(0)
摘要:题目链接:https://www.acwing.com/problem/content/7/ 思路: 如果将前面三个背包混合起来,也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包),应该怎么求解呢? 01背包与完全背包的混合考虑到 阅读全文
posted @ 2020-02-01 22:43 _Ackerman 阅读(279) 评论(0) 推荐(0)
摘要:题目大意: 这个问题和 01背包 问题很相似,我们也可以依然采取 01背包 的状态定义 dp[i][j] 代表前 i 个物品 容量为 j 的背包的最大价值 那么状态转移方程也就出来了: dp[i][j] = max(dp[i][j],dp[i-1][j-k*v[i]]+w[i]) (k 可以为 0, 阅读全文
posted @ 2020-02-01 22:06 _Ackerman 阅读(248) 评论(0) 推荐(0)
摘要:问题描述: 基本思路: 这个问题和 01背包 问题非常的相似,只是 01背包 问题要求了每个物品我们最多可以选一次(选和不选两种选择),但是完全背包问题只要容量够我们可以无限制的选 如果我们依然采取和 01背包 一样的状态的定义 dp[i][j] 代表 前 i 个物品 容量为 j 的时候的最大价值 阅读全文
posted @ 2020-02-01 21:32 _Ackerman 阅读(247) 评论(0) 推荐(0)
摘要:一.动态规划与递推解决01背包 初步分析: 0. 浅谈问题的分解 在处理到第i个物品时,可以假设一共只有i个物品,如果前面i-1个物品的总的最大价值已经定下来了,那么第i个物品选不选将决定这1~i个物品能带来的总的最大价值 刚刚是自顶向下,接下来反过来自底向上,第1个物品选不选可以轻松地用初始化解决 阅读全文
posted @ 2019-07-22 20:39 _Ackerman 阅读(473) 评论(0) 推荐(0)