题目
指定两个长度相同的数组weights和values,第一个表示每个物品的重量,第二个表示每个物品对应的价值,给定一个重量bag,要求重量不能超过bag,返回能够装下的最大价值
- 枚举装下物品的所有情况,那么所有情况的表示思路为第一个物品装或不装,第二个物品装或不装...
- 构造出的递归结构为values[i]+fn(lastWeights+weights[i]), fn(weights[i])
- 这题主要展示了递归的枚举思路,以及超过限制后通过返回值为0来不影响结果
function getPrice(weights, values, index, lastWeights, bag) {
if (lastWeights > bag) { // 超过规定值,返回0,结束递归
return 0;
}
if (index === weights.length) { // 所有物品装完,结束递归
return 0;
}
// Math.max 可以理解为当前索引下,装或不装情况产生的最大值,最终的最大值,由子最大值贪心得来
return Math.max(
getPrice(weights, values, index + 1, lastWeights, bag),
values[i] +
getPrice(weights, values, index + 1, weights[i] + lastWeights, bag)
);
}