背包问题总结

来源:互联网 发布:java 微信授权 编辑:程序博客网 时间:2024/04/28 13:21
背包问题 (Knapsack problem x ) 有很多种版本,常见的是以下三种:
• 0-1 背包问题 (0-1 knapsack problem):每种物品只有一个
• 完全背包问题 (UKP, unbounded knapsack problem):每种物品都有无限个可用
• 多重背包问题 (BKP, bounded knapsack problem):第 i 种物品有 c[i] 个可用

背包问题是一种“多阶段决策问题”。


定义状态 f[i][j],表示“把前 i 个物品装进容量为 j 的背包可以获得的最大价值”


0/1背包问题状态转移方程便是:
   f[i][j] = max{f[i − 1][j],f[i − 1][j − w[i] + v[i]}

可以简化为:

   d[j]=max{d[j],d[j-w[i]]+v[i]};

注意:遍历j时务必从右到左,因为d[j]只依赖于上一阶段的结果,从右到左避免覆盖上阶段有用结果


完全背包问题状态转移方程是:

   f[i][j] = max{f[i − 1][j − k ∗ w[i]] + k ∗ v[i],0 ≤ k ∗ w[i] ≤ j}

可以简化为:

   d[j] = max{d[j], d[j-k*w[i]] + k*v[i]} 

注意:遍历j时务必从右到左,原因同上


多重背包问题状态转移方程是:

   f[i][j] = max{f[i − 1][j − k ∗ w[i]] + k ∗ v[i],0 ≤ k ≤ c[i],0 ≤ k ∗ w[i] ≤ j}

可以简化为:

   d[j] = max{d[j], d[j-k*w[i]] + k*v[i]}

注意:遍历j时务必从右到左,原因同上

0 0
原创粉丝点击