多重背包问题讨论

fanerlight 2019-04-11 05:24:07
多重背包问题阐述:有N种物品和一个容量为C的背包。第i种物品最多有n[i]件可用,每件重量是w[i](整数),价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

关于这个问题网上建议使用二进制优化,更进一步的优化是单调队列优化。我自己想出一种O(NC)的算法,不知道是否正确,请大家从中挑挑毛病。

使用辅助数组k[N][C],其中元素k[i][j]表示前i种物品放入容量为j的背包价值最大时,第i种物品放入的个数。状态转移方程如下:f[i][j]表示i种物品,容量为j的背包放入的最高价值。递推时:
如果k[i][j-1]<n[i],此时意味着f[i][j]可能还能放入第i个物品,那么f[i][j]=max{f[i-1][j], f[i][j-w[i]]+v[i] };如果k[i][j-1]>=n[i], 此时意味着第i种物品已经被用光,无法继续放入,则此时f[i][j]=n[i]*v[i]+f[i-1][j-n[i]*w[i]]。关于k[i][j]的递推,如果放入了i物品,则k[i][j]++。

试问这种算法能否解决多重背包问题?如果可以的话,那么时间复杂度只有O(NC)了。
...全文
160 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2019-04-15
  • 打赏
  • 举报
回复
没那么简单的,每种物品数量有限制,因此你在递推的时候控制变量变数很大,无法用你的想法完美解决
fanerlight 2019-04-15
  • 打赏
  • 举报
回复
引用 1 楼 636f6c696e 的回复:
没那么简单的,每种物品数量有限制,因此你在递推的时候控制变量变数很大,无法用你的想法完美解决
请问控制变量具体指什么呢?您这样说我还不是很理解……

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧