No Change G

这道题目看到\(k\)非常小,可以尝试往状压上想

本来我是想像“校长的烦恼”那道题目一样,将物品作为阶段的,但是显然这里的\(N\)太大了,时间复杂度没有办法承受

所以只能将状态作为阶段,那么考虑数组值应该表示什么

我们读题发现,他让我们求的是最后剩下多少钱,我们此时已经把硬币状态记在某一维度里面了,通过这一维度可以直接推出剩下多少钱,所以不可能把剩余多少钱作为数组值,而题目剩下的另一个对象就是商品,题目还要求我们按照顺序购买商品,所以我们可以把数组值设成最多购买的商品数

我们枚举当前状态下用的最后一个硬币,用反证法不难证明,如果当前状态的最后一枚硬币确定了,那么当前状态能够购买的商品数量最多的必要条件是当前状态去除这最后一个硬币后的状态能够购买的物品(从头开始)最多,所以转移的正确性得证(一个小贪心)

后面可以用二分去判断最后一枚硬币最多能买的物品,但更优秀的做法是用2-pointers预处理,可以想一下

update 2024.7.1

其实就是转换对象思想的应用

update 2024.9.4

一个更自然的想法是用可行性DP,于是利用可行性转最优性的技巧就好了

posted @ 2024-01-30 10:48  最爱丁珰  阅读(3)  评论(0编辑  收藏  举报