题目
给定两个数组 w
和 v
,两个数组长度相等,w[i]
表示第i件商品的 重量,v[i]
表示第i件商品的价值。 再给定一个整数 bag
,要求你挑选商品的重量加起来一定不能超过 bag
,返回满足这个条件下,你能获得的最大价值。
题解
解法类似上一篇博客
暴力递归
穷举所有可能的结果, 迭代过程中判断累计重量 acc_weight
是否超过 bag
, 若超过则返回 Integer.MIN_VALUE
, 相当于直接舍弃该分支. 另一个迭代的基础条件为当 i
达到 w.length
时, 返回 0
, 因为第 i
次递归的返回值为当前商品的价值 v[i]
加上后续商品的价值与只有后续商品价值二者中的较大者, i
等于 w.length
时, 没有后续商品, 故直接返回 0
.
Java
1 | public class Knapsack { |
Python
1 | def max_value(w, v, i, acc_weight, bag): |
动态规划
此类无后效性的递归问题均可转化为动态递归.
步骤
- 分析可变参数, 求出表空间
- 确定最终状态
- 根据 base case 确定初始状态
- 分析一个普遍位置的依赖关系
- 根据依赖顺序, 逆序求出整张表
Java
1 | public class Knapsack { |
Python
1 | def max_value(w, v, bag): |