背包

母题1:01背包

考虑 \(f[i,j]\) 表示前 \(i\) 个物品体积为 \(j\) 的答案,答案可以从前 \(i-1\) 个物品继承或选取当前物品,\(f[i,j]=\max(f[i-1][j],f[i-1][j-v]+w)\)

母题2:完全背包(from 1)

状态同上,转移本来应该为 \(f[i,j]=\max(f[i-1][j-v]+w,f[i-1][j-2v]+2w,\dots,f[i-1][j-kv]+kw)\)(设 \(j-kv\ge 0,j-(k+1)v<0\))。发现 \(f[i,j-v]=\max(f[i-1][j-2v]+w,f[i-1][j-3v]+2w,\dots,f[i-1][j-kv]+(k-1)w)\),恰好是少了一个 \(w\),于是我们可以用 \(f[i,j]=\max(f[i][j-v]+w)\)

母题3:多重背包(from 1)

转移应该为 \(f[i,j]=\max(f[i-1,j-v]+w,f[i-1,j-2v]+2w,\dots,f[i-1,j-sv]+sw)\)(这里不管超出的情况)。

可以直接暴力,也有两种优化:

  • 二进制优化,很好理解,对于一个物品若可选 \(5\) 个,可以拆成两个物品 \(1\) 倍和 \(4\) 倍,然后做 01 背包,带一只 \(\log\)
  • 单调队列优化,不好理解,就是对于 \(j\bmod v\) 同一个余数的情况一起处理,发现对于每种物品就是长度为 \(s\) 的定长滑动窗口求最值模型。

母题4:分组背包(from 1)

就是某些物品在一个组内,组内只能选其一。

转移可以用 \(f[i,j]=f[i-1,j-v_k]+w_k\)(注意,同一组的物品对应一个 \(i\),这样从上一层转移可以保证不会出现一组内的物品选多个)。

母题5:有依赖的背包问题(from 4)

考虑树形 DP

处理出子树内的答案,然后根节点必选,子树内就是分组背包,有体积那么大的个数在一组内。

母题6:树上背包

有点类似于5,但是一般是01背包。

母题7:退背包

根据物品插入无顺序,所以可以将要删去的数当作刚刚插入,就可以正着删除(因为是倒着插入)。

以上就是7个模型

变式1

类背包,表示状态类似于,体积变为余数,考虑 \(+,\times\)。01背包模型

2

用小的组合出大的,就是给定一些物品,问凑出的个数,考虑完全背包(母题2),改变一下属性为 bool

需要简单证明结论的正确性,看上去比较显然。

3

本质还是背包,分类讨论,状态是由差值表示。01背包模型

4

利用背包求解博弈论,需要知道基本的必胜态、必败态。

然后考虑余数。01背包模型

5

01背包套矩阵快速幂。

6

母题6。

7

母题1,2的结合。

8

背包问题拆解成前后两个部分,第一部分类似于01背包,可以使用前缀和优化;第二部分还是01背包,维护差值。

9

通过期望的性质拆解贡献,配合最短路。

10

有点像背包,但是考虑到对称点的限制,我们需要新立状态,按照一对一对的点,而不是前多少个点。

11

首先是一个经典的线性DP的预处理,然后做一遍分组背包。

12

暴力枚举所有情况,分组背包即可。

总结

背包问题一般比较难的都是01背包(变式2很明显是完全背包,而且转移就是基本的转移,比母题还简单)。

题目中出现的数值可以成为“体积”。

转移有时需要分类讨论。

多种背包可能同时出现,一个背包问题可能可以拆解成好几个部分,两个部分有可能都是DP,也可能有一个是其他算法。

特征

可以明确的按照前几个物品算出答案,并且可以从题目中挖掘出体积。

定义

描述: 有 N 件物品和一个容量为 V 的背包。第 i 件物品 的费用是 c[i],价值是 w[i]。求解将哪些物品装入背包可使价值总和最大。

解析:\(N\) 件物品可以看做是有 \(N\) 种备选方案,容量为 \(V\) 的背包可以看做是成本为 \(V\)\(c[i]\) 是每种方案的成本,价值是每种方案带来的效益。那么问题就变成了,在不超过总成本V的情况下,使用哪些备选方案,可以使效益最大。

posted @ 2023-08-31 09:08  wscqwq  阅读(2)  评论(0编辑  收藏  举报