【题解】「Public NOIP Round #2」找零
【题解】「Public NOIP Round #2」找零
https://www.becoder.com.cn/contest/5546/problem/4
Tag: 背包、dp 凸优化
决策点单调触碰到知识点盲区了,所以来写几笔。
首先,由于我们只关心最终状态下 \(1\) 的最多个数,其实有用的面值只有 \(5,1\)(其她的可以当成若干个 \(5\) 来使用。
显然初始的 \(1\) 我们是不用的,于是现在问题转化为:
初始答案 \(ans\gets m-5\left\lfloor\dfrac m5\right\rfloor\)。
然后,\(m\gets m-ans\)。
现在每个物品 \((a,w)\) 变为:
- 价值:\(w\gets 5\left\lceil\dfrac a5\right\rceil-a\);
- 体积:\(a\gets a+w\)。
现在问题就是一个 类 0-1 背包了。
为什么说是 类?
因为,这道题的价值的范围只有 \([0,4]\),而体积很大,所以用一个叫做「值和状态反转」的 trick(自己瞎取名。😅
具体地,重新定义状态:
\(f_{i,j}\):选了前 \(i\) 个物品,价值为 \(j\) 的最小体积。
这样就可以做到:\(O(n^2)\) 了。
正解其实也是以价值范围巨小作为突破口。
注意到:注意到如果价值相同,那么一定是按价格从小到大选。
所以我们继续重新定义状态:
\(f_{i,j}\):表示价值小于等于 \(i\) 的那些物品,价值和为 \(j\) 的最小体积。
也就是说,我们把所有价值一样的放在一起处理。
由于我们对于相同的价值的物品,肯定是选前缀,而且价格单增,所以前缀就一定是 下凸 的。
关于判定决策点单调一般有两种方式:
四边形不等式。
直接硬看价值函数。实际上也是有技巧的,常见的,如果价值函数是凸的,那么就有决策点单调。
感性理解一下,其实凸的性质给到的就是,越靠近当前点的决策点和远离当前点的决策点带来的影响是不一样的,并且不是均匀变化的,所以一定有一边是在当前点移动的时候会更优的。
根据上面说的,就可以用决策点单调把从 \(f_i\) 转移到 \(f_{i+1}\) 优化到 \(O(n\log n)\)。
题外话:由于我们的价值函数是单调的,那么我们的 dp 数组也是单调的,合并的时候是 min+ 卷积,这样的话用闵可夫斯基和可以做到:\(O(n)\)(?
注意到这类问题,实际上启示我们。
当不同的体积个数并不大的时候,我们可能把相同的合起来、不同的分开处理,这样在合并的时候由于一些性质(比如凸性),可以优化。
这个 课件 里面第 85 页讲述的也是这个东西。