- 好早以前写的,搬运一下
01一维背包
- 有 n 种物品要放到一个袋子里,袋子的总容量为 m,第 i 种物品的体积为 vi,把它放进袋子里会获得 wi 的收益,每种物品至多能用一次,问如何选择物品,使得在物品的总体积不超过 m 的情况下,获得最大的收益?请求出最大收益
|
|
01背包二维
- 有 n(1 ≤ n ≤ 100) 种物品要放到一个袋子里,袋子的总容量为 m(1 ≤ m ≤ 100) ,我们一共有 k(1 ≤ k ≤ 100) 点体力值。第 i 种物品的体积为 vi(1 ≤ vi ≤ 100) ,把它放进袋子里会获得 wi(1 ≤ wi ≤ 100) 的收益,并且消耗我们 ti(1 ≤ ti ≤ 100) 点体力值,每种物品只能取一次,问如何选择物品,使得在物品的总体积不超过 m 并且花费总体力不超过 k 的情况下,获得最大的收益?请求出最大收益。
|
|
完全背包
- 有 n 种物品要放到一个袋子里,袋子的总容量为 m,第 i 种物品的体积为 vi,把它放进袋子里会获得 wi 的收益,每种物品能用无限多次,问如何选择物品,使得在物品的总体积不超过 m 的情况下,获得最大的收益?请求出最大收益。
|
|
多重背包
- 有 n 种物品要放到一个袋子里,袋子的总容量为 m,第 i 种物品的体积为 vi,把它放进袋子里会获得 wi 的收益,可以用 li 次,问如何选择物品,使得在物品的总体积不超过 m的情况下,获得最大的收益?请求出最大收益。数据规模为 1 ≤ n, m, l ≤ 1000
|
|
多重背包的单调队列优化
- 多重背包的题: 有 n 种物品要放到一个袋子里,袋子的总容量为 m,第 i 种物品的体积为 vi,把它放进袋子里会获得 wi 的收益,可以用 li 次,问如何选择物品,使得在物品的总体积不超过 m的情况下,获得最大的收益?请求出最大收益。数据规模为 1 ≤ n, m, l ≤ 1000 多重背包的二进制优化 : 题目同上,数据规模为 1 ≤ n, m, l ≤ 2000。用一个定理优化一下。定理:令 t 为最大的 i满足 2i+1 − 1 ≤ n,我们从 1, 2, 4, . . . , 2t, n − 2t+1 + 1 中选一些数字相加(可以不选),可以得出任意 [0, n] 内的值,每个数字只能用一次。每一种物品就只有 log l 个打包,然后对于每一组打包去跑 01 背包,可以把时间复杂度从 O(nm∑l) 降到 O(nm log∑l)。 但显然二进制优化不如单调队列优化,所以我们为什么不直接上单调队列优化呢? 二进制优化的数据范围:题目同上,数据规模为 1 ≤ n, m, l ≤ 10000。
|
|
|
|
分组背包
- 有 n 种物品要放到一个袋子里,袋子的总容量为 m。第 i 个物品属于第 ai 组,每组物品我们只能从中选择一个。第 i 种物品的体积为 vi,把它放进袋子里会获得 wi 的收益,可以用 li 次,问如何选择物品,使得在物品的总体积不超过 m 的情况下,获得最大的收益?请求出最大收益。数据规模为 1 ≤ n, m, l ≤ 1000
|
|
混合背包
- 混合背包比较愚蠢,很显然,如果是01,那么就直接取01;如果是完全,那就完全,如果是多重那就多重。
|
|
有依赖的背包
- 题目:金明有 n 元钱,想要买 m 个物品,第 i 件物品的价格为: ,重要度为: 。有些物品是从属于某个主件物品的附件,要买这个物品,必须购买它的主件。
- 目标是让所有购买的物品的: 之和最大。
- 这种题目比较愚蠢,就懒得写代码了,把主件当01背包做,把附件的代码+主件的代价,再把附件当做分组背包做即可。
k优解
- 不会
前后缀分解
-
显然对于01背包而言,存在需要放进去的物品和不需要放进去的物品,现在清楚姐姐有个问题,题目如下:
-
清楚姐姐最近学会了01背包,01背包是背包问题中最简单的问题。
-
01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。
-
如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。
-
现在清楚姐姐有N个蝴蝶结,第i个蝴蝶结的体积为 ,好看程度为 ,她准备了一个容量大小为M的包包。她可以从这N个蝴蝶结中任选若干个放入背包,但是所选蝴蝶结的体积总和不能大于背包的容量M,清楚姐姐想要让所选蝴蝶结的好看程度总和最大化。
-
她运用自己刚刚学会的01背包知识,快速算出了她能用她的包包装下蝴蝶结好看程度总和的最大值。现在清楚姐姐有了一个新的问题,我们定义原问题的答案,即所选蝴蝶结好看程度总和的最大值为 。
-
定义从这NN个蝴蝶结中去掉第i个蝴蝶结后,从剩余N−1个蝴蝶结中任选若干个放入背包,所选蝴蝶结好看程度总和的最大值为 。若 < ,则称第ii个蝴蝶结为一个“必选蝴蝶结”。
-
清楚姐姐现在获得了调整蝴蝶结好看程度的机会,她想要知道,对于第i个蝴蝶结,在它初始好看程度的基础上,再加上多少,该蝴蝶结就能够成为一个“必选蝴蝶结”。
-
数据范围: n,m<5000, <m <1e9
-
题解 设f[i][j]是前i个物品中重量总和为j时的最大值,g[i][j]是后i个物品中重量总和为j时的最大值,显然这两个都可以O(nm)求,对于每个物品i,只需要遍历f[i-1][j]中的j,然后最大值就是f[i-1][j]+g[i+1][m-j],这样对于每个物品可以用O(m)求出答案,总体是O(nm)的,求出最大值之后,再从0遍历到m-w[i],再次求一遍前后最大值,这样求出的最大值就是不包含自己且背包大小为m-w[i]时的最大价值,然后再用原本的数值+1-这个值-v[i]就是这个的答案。
|
|
01背包+线段树
- 你真该死啊