当前位置:首页 > JavaScript

JS实现背包

2026-03-15 03:44:41JavaScript

背包问题的基本概念

背包问题是一个经典的动态规划问题,通常分为 0-1背包完全背包 两种类型。0-1背包中,每个物品只能选择一次;完全背包中,每个物品可以选择多次。以下是使用 JavaScript 实现 0-1背包的示例代码。

0-1背包问题的动态规划解法

动态规划的核心是构建一个二维数组 dp,其中 dp[i][j] 表示从前 i 个物品中选择,总重量不超过 j 时的最大价值。

function knapsack(weights, values, capacity) {
  const n = weights.length;
  const dp = Array(n + 1).fill().map(() => Array(capacity + 1).fill(0));

  for (let i = 1; i <= n; i++) {
    for (let j = 1; j <= capacity; j++) {
      if (weights[i - 1] <= j) {
        dp[i][j] = Math.max(
          dp[i - 1][j],
          dp[i - 1][j - weights[i - 1]] + values[i - 1]
        );
      } else {
        dp[i][j] = dp[i - 1][j];
      }
    }
  }

  return dp[n][capacity];
}

const weights = [2, 3, 4, 5];
const values = [3, 4, 5, 6];
const capacity = 8;
console.log(knapsack(weights, values, capacity)); // 输出最大价值

优化空间复杂度

二维数组 dp 可以优化为一维数组,减少空间占用:

function knapsackOptimized(weights, values, capacity) {
  const dp = Array(capacity + 1).fill(0);

  for (let i = 0; i < weights.length; i++) {
    for (let j = capacity; j >= weights[i]; j--) {
      dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
    }
  }

  return dp[capacity];
}

console.log(knapsackOptimized(weights, values, capacity)); // 输出相同结果

完全背包问题的解法

完全背包允许物品重复选择,只需调整内层循环的方向:

JS实现背包

function completeKnapsack(weights, values, capacity) {
  const dp = Array(capacity + 1).fill(0);

  for (let i = 0; i < weights.length; i++) {
    for (let j = weights[i]; j <= capacity; j++) {
      dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
    }
  }

  return dp[capacity];
}

console.log(completeKnapsack(weights, values, capacity)); // 输出完全背包的最大价值

应用场景

背包问题广泛应用于资源分配、投资组合优化等场景。动态规划解法的时间复杂度为 $O(n \cdot W)$,其中 $n$ 是物品数量,$W$ 是背包容量。

标签: 背包JS
分享给朋友:

相关文章

JS如何实现左右滑动

JS如何实现左右滑动

实现左右滑动的方法 使用 touchstart、touchmove 和 touchend 事件监听触摸操作,计算滑动距离和方向。 let startX, moveX; element.addEve…

JS实现一个并发函数

JS实现一个并发函数

实现并发控制的几种方法 在JavaScript中实现并发控制可以通过多种方式,以下是几种常见的方法: Promise.all 使用Promise.all可以并行执行多个异步任务,等待所有任务完成后再…

JS奇数实现

JS奇数实现

判断数字是否为奇数 在JavaScript中,可以通过取模运算符(%)来判断一个数字是否为奇数。奇数除以2的余数为1。 function isOdd(num) { return num %…

JS实现netty

JS实现netty

在JavaScript中实现类似Netty的功能 Netty是一个高性能的Java网络框架,专注于异步事件驱动的网络编程。要在JavaScript中实现类似功能,可以使用Node.js的核心模块或第三…

JS实现ln

JS实现ln

在JavaScript中实现自然对数(ln)功能可以通过以下几种方式完成: 使用Math对象的原生方法 JavaScript内置的Math对象提供了Math.log()方法,该方法默认计算以…

JS实现GPS

JS实现GPS

GPS定位的基本原理 GPS定位主要通过浏览器提供的Geolocation API实现。该API允许网页获取用户设备的地理位置信息,前提是用户授权同意。位置信息通常来源于设备的GPS模块、Wi-Fi或…