后缀背包
后缀背包是用于解决存在 选取的物品数量之间必须存在严格单调关系 这一要求的背包问题,属于完全背包的变式。
比如:有 \(n\) 种物品,体积 \(v_{i}\) 价值 \(w_{i}\),背包体积为 \(V\),每种物品可以无限选择,但必须满足:\(\forall i \in [1,n-1]\),选取第 \(i\) 种物品的数量 \(<\) 选取第 \(i + 1\) 种物品的数量,求最大价值(方案数...)。
对于严格单调的序列,我们首先应当注意到一个性质——它的差分数组的每一项 \(d_{i} > 0\)。那么,我们不难想到可以通过对差分数组做背包间接满足“严格单调”这一要求:将差分数组的每一项看做物品,那么每种物品的选取要求就放宽了——只需要选择至少一个即可。而每一个 \(d_{i}\) 都必须至少为1,那我们便可以将每一种物品都固定选择一个,而对于剩下的物品,便相当于经典完全背包。
而对于差分数组中的某一项 \(d_{i}\) 加1,等价于选取第 \(i\) 到 \(n\) 种物品各一个,即相当于选取一个后缀。这便是后缀背包的核心要义——将物品序列的每一个后缀看作是一种新的物品,对这 \(n\) 个后缀的任意选择,可以保证原物品的选取满足数量上的单调性。
而注意到,差分数组中的每一项初值都是1。因此,对于每个物品,都要先将必须选取的部分从背包中扣除,而第 \(i\) 个物品一定至少选择 \(i\) 个,于是我们钦定对于 \(\forall i \in [1,n]\),已经选择了 \(i\) 个第 \(i\) 种物品,扣除这些必选的部分,然后对于剩下的部分,每次必须选择一个完整的后缀,以保证物品选取数量的单调性。
于是问题便转化为了对原序列的每个后缀做完全背包。将必须选取的部分刨除,再预处理出每个后缀的体积和价值,对这些后缀做经典完全背包,即为所求。具体细节可以参考例题。
例题:

浙公网安备 33010602011771号