当前位置:首页 > JavaScript

JS实现背包

2026-04-06 21:20:14JavaScript

背包问题的基本概念

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

JS实现背包

0-1背包问题的实现

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

JS实现背包

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背包问题的实现使用了二维数组,可以优化为一维数组以节省空间。

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实现跳表

JS实现跳表

跳表的基本概念 跳表(Skip List)是一种基于概率的数据结构,允许快速查询、插入和删除操作,时间复杂度平均为O(log n)。它通过多层链表实现,每一层都是下一层的子集,高层链表跳过多个元素,从…

JS实现日期滚动选择

JS实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含年…

JS能实现跨平台吗

JS能实现跨平台吗

JavaScript 的跨平台能力 JavaScript 是一种高度灵活的脚本语言,通过不同运行时环境和工具链可以实现跨平台开发。以下是其跨平台能力的核心实现方式: 浏览器环境 JavaScript…

用JS实现冰墩墩

用JS实现冰墩墩

以下是用JavaScript绘制冰墩墩的几种实现方法,结合Canvas绘图和SVG路径数据: 使用Canvas绘制基础轮廓 const canvas = document.createEleme…

实现阶乘JS

实现阶乘JS

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

JS实现取色

JS实现取色

使用 input[type="color"] 获取颜色值 HTML5 提供了原生颜色选择器,通过 <input type="color"> 可直接调用系统取色工具。用户选择的颜色会以十六进…