简要题意
有(n)个物品,每个物品有价格(p)和价值(w)两个属性。
可以选一些物品买,然后给出两个正整数(a)和(b):如果买了(k)个物品,最多还可以免费送(leftlfloor frac{k}{a}
ight
floor + leftlfloor frac{k}{a}
ight
floor)个物品。
求出对于每一个(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^2log{n}))的。