递归 背包重量和最大价值

52 阅读1分钟

题目

指定两个长度相同的数组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)
  );
}