背包问题 (Knapsack problem x ) 有很多种版本,常见的是以下三种:
• 0-1 背包问题 (0-1 knapsack problem):每种物品只有一个
• 完全背包问题 (UKP, unbounded knapsack problem):每种物品都有无限个可用
• 多重背包问题 (BKP, bounded knapsack problem):第 i 种物品有 c[i] 个可用
• 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时务必从右到左,原因同上