0 - 1背包问题
问题描述:
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W(假定物品重量与背包容量值均为整数),应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?设计一个动态规划算法,求解背包问题。
❗算法描述❗:
定义 w[] 存储各物品的重量,v[] 存储各物品的价值,背包的重量为 wsum。
①定义子问题:
k(w, j) = 容量剩余 w 时,从物品 1 到 j 能得到的最高价值。
②是否满足最优子结构:
k(w, j) = max( k(w - wj, j-1) + vj,k(w, j-1));
前者指,第 j 个物品放入背包中,则产生的最高价值就是,在背包容量为 w-wj 的情况下,在 0 ~ j-1 这些物品中能产生的最高价值 + 第 j 个物品 的价值;
后者指,第 j 个物品不放入背包中,则产生的最高价值就是,背包容量还剩 w,在0 ~ j-1 这些物品中能产生的最高价值。
所以,
| 0, if w == 0 or j = 0
k(w, j) = | k(w, j-1), if w < wj
| max(