- 博客(53)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注
原创 dp分组背包
我们可以将 t(k,i) 表示第 k 组的第 i 件物品的编号是多少,再用 cnt (k) 表示第 k 组物品有多少个。其实是从「在所有物品中选择一件」变成了「从当前组中选择一件」,于是就对每一组进行一次 0-1 背包就可以了。背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于。组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。,表示物品的重量,利用价值,所属组数。背包,他的物品大致可分为。一个数,最大的利用价值。这里要注意:一定不能。,这样才能保证正确性。
2023-05-02 10:44:05
423
原创 二维费用背包
洛谷的运营组决定,如果一名 OIer 向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有 2020 个或以上的成员,上传 1010 道以上的私有题目,布置过一次作业并成功举办过一次公开比赛),那么他可以浪费掉 kkksc03 的一些时间的同时消耗掉 kkksc03 的一些金钱以满足自己的一个愿望。既可以是团队内部的私有比赛,也可以公开赛,甚至可以指定谁可以参加比赛。这道题是很明显的 0-1 背包问题,可是不同的是选一个物品会消耗两种价值(经费、时间),只需在状态中增加一维存放第二种价值即可。
2022-11-29 20:46:30
51
原创 混合背包问题
题意概要:有 n 种樱花树和长度为 T 的时间,有的樱花树只能看一遍,有的樱花树最多看 Ai 遍,有的樱花树可以看无数遍。每棵樱花树都有一个美学值 Ci,求在 T 的时间内看哪些樱花树能 使美学值最高。这种题目看起来很吓人,可是只要领悟了前面几种背包的中心思想,并将其合并在一起就可以了。混合背包就是将前面三种的背包问题混合起来,有的只能取一次,有的能取无限次,有的只能取k次。由于实际代码量太大,这里就不做展示了,当然量大不代表难。由于非常简单,这里直接给出代码,核心代码在前面几篇博客里都有讲到。
2022-11-29 20:26:55
58
原创 多重背包问题
多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品有ki个,而非一个。一个很朴素的想法就是:把「每种物品选ki次」等价转换为「有ki个相同的物品,每个物品选一次」。这样就转换成了一个 0-1 背包模型,套用上文所述的方法就可已解决。状态转移方程如下:时间复杂度。
2022-11-20 19:07:44
300
原创 完全背包问题
题意概要:有n种物品和一个容量为w的背包,每种物品有重量wi和价值vi两种属性,要求选若干个物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。我们可以借鉴 0-1 背包的思路,进行状态定义:设 fi,j 为只能选前 i 个物品时,容 量为 j 的背包可以达到的最大价值。考虑做一个简单的优化。完全背包模型与 0-1 背包类似,与 0-1 背包的区别仅在于一个物品可以选取无限次,而非仅能选取一次。需要注意的是,虽然定义与 0-1 背包类似,但是其状态转移方程与 0-1 背包并不相同。
2022-11-19 00:14:53
63
原创 0-1背包问题
在将什么是0-1背包问题前,先来看下面一道例题:题意概要:有 n 个物品和一个容量为 W 的背包,每个物品有重量w i和价值v i两种属性,要求 选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。在上述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中 的 0 和 1,这类问题便被称为「0-1 背包问题」。
2022-11-16 21:13:27
294
原创 背包dp-前言(这也许是全网最全的背包dp了)
由于动态规划并不是某种具体的算法,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。动态规划(Dynamic Programming, DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。以上就是这一期专栏要讲的所有背包dp问题了,这也许是全网最全的背包dp了,如果不全勿喷,请告诉我,我会及时补充。在动“态规划-背包dp”的专栏里,将会分为9个专项来为大家讲解动态规划。在学习背包dp之前,先要知道关于动态规划的一些基础知识。
2022-11-15 20:35:56
150
原创 记忆化搜索
记忆化搜索是一种通过记录已经遍历过的状态的信息,从而避免对同一状态重复遍历的搜索实现方式。因为记忆化搜索确保了每个状态只访问一次,它也是一种常见的动态规划实现方式。
2022-11-15 20:10:43
237
原创 最长不下降子序列(接上一篇)
接着上一篇讲,这个最长不下降子序列,先给大家看一下题目。给定一个长度为 n 的序列 A(n ≤ 5000),求出一个最长的 A 的子序列,满足该子序列的后一个 元素不小于前一个元素。
2022-11-14 20:32:13
236
原创 动态规划基础
本篇博客要介绍了动态规划的基本思想,以及动态规划中状态及状态转移方程的设计思路,帮助各位初学者对动态规划有一个初步的了解。本部分的其他页面,将介绍各种类型问题中动态规划模型的建立方法,以及一些动态规划的优化技巧。
2022-11-13 19:55:43
209
原创 搜索算法优化
DFS(深度优先搜索)是一种常见的算法,大部分的题目都可以用 DFS 解决,但是大部分情况下,这都是骗分算法,很少会有爆搜为正解的题目。因为 DFS 的时间复杂度特别高。(没学过 DFS 的请自行补上这一课)既然不能成为正解,那就多骗一点分吧。那么这一篇文章将介绍一些实用的优化算法(俗称“剪枝”)。先来一段深搜模板,之后的模板将在此基础上进行修改。int ans = 最坏情况, now;// now 为当前答案void dfs(传入数值) {
2022-11-12 14:36:12
101
原创 Alpha-Beta 剪枝
Minimax$ 算法又叫极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。1在局面确定的双人对弈里,常进行对抗搜索,构建一棵每个节点都为一个确定状态的搜索树。奇数层为己方先手,偶数层为对方先手。搜索树上每个叶子节点都会被赋予一个估值,估值越大代表我方赢面越大。我方追求更大的赢面,而对方会设法降低我方的赢面,体现在搜索树上就是,奇数层节点(我方节点)总是会选择赢面最大的子节点状态,而偶数层(对方节点)总是会选择我方赢面最小的的子节点状态。
2022-11-11 19:42:38
1422
1
原创 DFS深度优先搜搜
DFS 为图论中的概念。在搜索算法中,该词常常指利用递归函数方便地实现暴力枚举的算法,与图论中的 DFS 算法有一定相似之处,但并不完全相同。
2022-07-29 11:10:18
55
原创 C++二分答案
解题的时候往往会考虑枚举答案然后检验枚举的值是否正确。若满足单调性,则满足使用二分法的条件。把这里的枚举换成二分,就变成了“二分答案”。
2022-07-27 17:37:42
367
原创 C++二分查找
二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是用来在一个有序数组中查找某一元素的算法。
2022-07-27 14:53:07
4166
原创 C++快速排序
快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称快排,是一种被广泛运用的排序算法。
2022-07-26 17:03:46
349
原创 C++计数排序
基数排序(英语:Radix sort)是一种非比较型的排序算法,最早用于解决卡片排序的问题。它的工作原理是将待排序的元素拆分为k个关键字(比较两个元素时,先比较第一关键字,如果相同再比较第二关键字……),然后先对第k关键字进行稳定排序,再对第k-1关键字进行稳定排序,再对第k-2关键字进行稳定排序……最后对第一关键字进行稳定排序,这样就完成了对整个待排序序列的稳定排序。...
2022-07-25 22:05:15
296
原创 C++插入排序算法
插入排序(英语:Insertion sort)是一种简单直观的排序算法。它的工作原理为将待排列元素划分为“已排序”和“未排序”两部分,每次从“未排序的”元素中选择一个插入到“已排序的”元素中的正确位置。...
2022-07-25 11:59:56
169
原创 C++sort排序
优点:速度快,时间复杂度为log(n)级别。缺点:sort为不稳定排序。例如两个一样的数,有可能第一个在前,也有可能第二个在前。
2022-07-25 11:51:56
120
原创 C++冒泡排序
冒泡排序(英语:Bubble sort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。
2022-07-25 08:06:41
2583
1
原创 C++选择排序
选择排序(英语:Selection sort)是一种简单直观的排序算法。它的工作原理是 每次找出第 i 小的元素(也就是 Ai..n 中最小的元素),然后将这个元素与数组第 i 个位置上的元素交换。
2022-07-25 08:00:53
44
原创 C++贪心算法
贪心算法(英语:greedy algorithm),是用计算机来模拟一个“贪心”的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。...
2022-07-24 20:56:07
1042
原创 C++递归算法
递归(英语:Recursion),在数学和计算机科学中是指在函数的定义中使用函数自身的方法,在计算机科学中还额外指一种通过重复将问题分解为同类的子问题而解决问题的方法。
2022-07-24 20:22:14
1465
原创 C++模拟算法
模拟就是用计算机来模拟题目中要求的操作。模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时间的。
2022-07-24 13:40:02
424
原创 C++枚举
枚举(英语:Enumerate)是基于已有知识来猜测答案的一种问题求解策略。枚举的思想是不断地猜测,从可能的集合中一一尝试,然后再判断题目的条件是否成立。
2022-07-24 13:35:43
34
我的细胞为什么错了呢
2022-07-23
我的letters为什么错了
2022-07-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人