1、场景
有一天,一个小偷想要进去一家超市行窃,他的背包大小为3(即最多可以存放总计重量为3的商品)
超市中一共有3件商品,商品的重量和价值如下图所示。请问小偷要如何获取最大收益?
2、解题思路
将商品按重量从小到大的顺序进行排列,建立如下二维模型
w[i]
,v[i]
表示第 i 个商品的重量
和价值
,sum[i+1][j]
表示背包大小为j
时,
在商品{p0…pi}(p0是不偷)中能够偷到的最大价值,计算公式为:
if (w[i] > j) {
sum[i + 1][j] = sum[i][j];
} else {
sum[i + 1][j] = Math.max(sum[i][j], v[i] + sum[i][j - w[i]]);
}
3、代码实现
/**
* @param n 商品个数
* @param w 商品重量数组
* @param v 商品价值数组
* @param weight 背包的最大负重
* @return 最大的价值
*/
public static int solve(int n, int[] w, int[] v,int weight) {
int[][] sum = new int[n + 1][weight + 1];
//遍历商品
for (int i = 0; i < n; i++) {
//遍历背包
for (int j = 1; j <= weight; j++) {
if (w[i] > j) {
sum[i + 1][j] = sum[i][j];
} else {
sum[i + 1][j] = Math.max(sum[i][j], v[i] + sum[i][j - w[i]]);
}
}
}
return sum[n][weight];
}