多重背包问题
声明原题:
有n种物品,第i种物品的重量为wi,价值为vi,共ti个。
现在有一个载重量为W的背包,在不超重的情况下,使放入背包的物品价值总和最大。
求最大的价值总和。
纯DP
设 Fi,j 表示拿完前i种物品,受重为j的最大获益。
显然 Fi,j=Max{ Fi−1,j−k∗wi+k∗vi} (0<=k<=Min{ ti,jwi})
然而这时O(nmk)的,当n,m太大时他就不行了。
那我们可以想一想,是否可以将k转化为1。我们就立刻想到了“单调”这个词,想到了单调这个词,就想到了单调队列优化dp。
单调队列也只是我前几天才学会的,单调队列它是一个队列,它具有单调性,也就是对于它的每一次询问可以O(1)完成,单调队列由两个指针头、尾指针来维护,头指针是来确保正确性和有效性的,从头指针到尾指针我们要确保这些值有效并且前者比后者优,这样我们就可以直接对头指针的值求出答案。
那么如何才能让单调队列来优化这一个多重背包问题呢?我们首先观察一下方程:
Fi,j=Max{
Fi−1,j−Wi∗k+Vi∗k}
我们可以通过队列存储 Fi−1,j−Wi∗k 和