我对Knapsack DP解决方案的javascript实现是否正确利用了备注表?

时间:2019-01-14 07:25:49

标签: javascript dynamic-programming memoization knapsack-problem

这是我针对背包问题的javascript实现。在此问题中,将为您提供具有重量和值的物品清单以及具有重量能力的背包。目的是确定如何在不超过重量的情况下最大程度地增加背包中可以容纳的物品的价值。我下面的函数有两个参数,项目(项目(一组项目对象,每个包含一个weight和value字段),以及一个容量整数,代表背包重量)。我使用一个备忘录表,其中存储了每个index:weight以便重复访问避免重复计算getMax()。我的实现效果好吗?可以改进吗?

function knapsackMaxValue(items, capacity) {
  const memo = {}
  function getMax(i, weight) {
    if (i == items.length) {
      return 0;
    }
    if (memo[i + ':' + weight] != undefined) {
      console.log('memo found')
      return memo[i + ':' + weight]
    }
    if (items[i].weight + weight > capacity) {
      memo[i + ':' + weight] = getMax(i + 1, weight)
      return memo[i + ':' + weight]
    } else {
      let maxValue = Math.max(getMax(i + 1, weight), items[i].value + getMax(i + 1, weight + items[i].weight))
      memo[i + ':' + weight] = maxValue
      return maxValue
    }
  }
  return getMax(0, 0)
}

0 个答案:

没有答案