当前位置:首页 > JavaScript

JS实现背包

2026-04-06 21:20:14JavaScript

背包问题的基本概念

背包问题是一个经典的动态规划问题,通常分为0-1背包和完全背包两种类型。0-1背包问题中,每种物品只能选择一次;完全背包问题中,每种物品可以选择多次。

0-1背包问题的实现

以下是0-1背包问题的JavaScript实现代码。假设给定物品的重量数组weights、价值数组values和背包容量capacity

function knapsack01(weights, values, capacity) {
    const n = weights.length;
    const dp = Array.from({ length: n + 1 }, () => 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(knapsack01(weights, values, capacity)); // 输出最大价值

完全背包问题的实现

完全背包问题允许每种物品选择多次。以下是其JavaScript实现代码。

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

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

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

优化空间复杂度

上述0-1背包问题的实现使用了二维数组,可以优化为一维数组以节省空间。

JS实现背包

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

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

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

注意事项

  • 动态规划表格的初始化需要根据问题需求调整。
  • 完全背包问题的内层循环是正向遍历,而0-1背包问题的优化版本是逆向遍历。
  • 确保输入的weightsvalues数组长度一致,且容量为非负数。

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

相关文章

JS如何调用react组件

JS如何调用react组件

调用React组件的常见方法 在JavaScript中调用React组件通常涉及以下几种场景和方式: 直接渲染组件 通过ReactDOM.render()方法将组件渲染到DOM节点: import…

JS节流和防抖的实现

JS节流和防抖的实现

节流(Throttle)的实现 节流是指在一定时间间隔内,函数最多执行一次。常用于限制高频事件的触发频率,如滚动事件、窗口调整等。 function throttle(func, delay) {…

实现阶乘JS

实现阶乘JS

递归实现阶乘 递归是一种直接按照数学定义实现阶乘的方法。n的阶乘可以表示为n乘以(n-1)的阶乘,基础情况是0的阶乘为1。 function factorialRecursive(n) { if…

动态实现JS

动态实现JS

动态实现 JavaScript 的方法 动态加载脚本 通过创建 script 元素并插入到 DOM 中实现动态加载。例如: const script = document.createEleme…

JS实现inpubox

JS实现inpubox

实现 InputBox 的基本结构 使用 HTML 和 CSS 创建一个基础的输入框结构,确保样式简洁且易于扩展。 <div class="input-box"> <input…

JS实现并发请求

JS实现并发请求

使用Promise.all实现并发请求 Promise.all可以同时发起多个异步请求,并在所有请求完成后统一处理结果。该方法适用于需要同时获取多个独立数据的场景。 const urls = ['u…