背包问题

435 阅读1分钟

说明

给定一个固定大小,能够携带重量w的背包,以及一组有价值和重量的物品,找出一个最佳解决方案,是的装入背包的物品总重量不超过w,且总价值最大

例子

背包重量为5,有物品的重量为[2,3,4],价值为[3,4,5],找出最佳解决方案

思路

如下图矩阵 image.png

代码

function knapSack(capacity, weights, values) {
  // 初始化矩阵,
  const ks = [];
  for (let i = 0; i <= values.length; i++) {
    ks[i] = []
  }
  for (let i = 0; i <= values.length; i++) {
    for (let w = 0; w <= capacity; w++) {
      // 总重量为 0 或者物品为0(没有物品)的价值都为0
      if(w === 0 || i ===0){
        ks[i][w] = 0
      }else if(weights[i-1]<=w){//只有当前物品重量小于总重量才才纳入计算
        // values[i-1]为当前物品价值
        // [w-weights[i - 1]] 为总重量 - 当前物品重量 = 剩余可用重量
        // ks[i-1][w-weights[i - 1]] 为剩余重量的价值
        let a = values[i-1] +ks[i-1][w-weights[i - 1]]
        let b = ks[i-1][w]
        ks[i][w] = Math.max(a,b)
      }else{
        // 当前物品重量大于总重量时,使用上一轮得到的价值
        ks[i][w] = ks[i-1][w]
      }
      
    }
  }
  return ks;
}
const values = [3, 4, 5];
const weights = [2, 3, 4];
const capacity = 5;
console.log(knapSack(capacity, weights, values))