Fork me on GitHub 返回顶部

「UOJ495」新年的促销

简要题意

\(n\)个物品,每个物品有价格\(p\)和价值\(w\)两个属性。
可以选一些物品买,然后给出两个正整数\(a\)\(b\):如果买了\(k\)个物品,最多还可以免费送\(\left\lfloor \frac{k}{a} \right\rfloor + \left\lfloor \frac{k}{a} \right\rfloor\)个物品。
求出对于每一个\(j \in [1,m]\),最多花费\(j\)元钱能得到的最大价值。

题目解法(照搬官方题解

考试的时候只想到了\(60\)分的\(O(n^3m)\)\(DP\),之后还想了\(O(n^3)\)的做法,发现不太行,就没搞了,看了题解,发现自己还是太菜了。

我们考虑如果确定了要得到的物品集合,手中的\(k\)元钱是否够用。
这是一个类似贪心的东西, 因为反正这些物品我们都是要全都得到的,所以我们可以按价格从低到高来买,能买就买,之后看一看剩下的能不能全都白送就好了。
于是我们可以发现最优解一定是以某一个价格为界,低于这个价格的都是买的,高于这个价格的都是送的。
那么我们就将这\(n\)个物品按照价格从低到高排序,设\(f[i][j][k]\) 表示前\(i\)个物品,花了\(j\)元钱,买了\(k\)个物品的最大收益,对于后面的\(n-i\)个物品,我们只要调价值大的送就好了。

复杂度:\(f\)\(O(n^2m)\)的,之后的贪心是\(O(n^2\log{n})\)的。

posted @ 2020-04-16 15:15  tacmon  阅读(128)  评论(0编辑  收藏  举报