码迷,mamicode.com
首页 > 编程语言 > 详细

使用单调队列优化的 O(nm) 多重背包算法

时间:2014-12-15 23:18:14      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:blog   http   ar   使用   sp   art   log   bs   代码   

我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接

 

解析

多重背包的最原始的状态转移方程:

令 c[i] = min(num[i], j / v[i])

f[i][j] = max(f[i-1][j-k*v[i]] + k*w[i])     (1 <= k <= c[i])  这里的 k 是指取第 i 种物品 k 件。

如果令 a = j / v[i] , b = j % v[i] 那么 j = a * v[i] + b.

这里用 k 表示的意义改变, k 表示取第 i 种物品的件数比 a 少几件。

那么 f[i][j] = max(f[i-1][b+k*v[i]] - k*w[i]) + a*w[i]      (a-c[i] <= k <= a)

可以发现,f[i-1][b+k*v[i]] - k*w[i] 只与 k 有关,而这个 k 是一段连续的。我们要做的就是求出 f[i-1][b+k*v[i]] - k*w[i] 在 k 取可行区间内时的最大值。

这就可以使用单调队列优化。

 

代码

 

使用单调队列优化的 O(nm) 多重背包算法

标签:blog   http   ar   使用   sp   art   log   bs   代码   

原文地址:http://www.cnblogs.com/JoeFan/p/4165956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!