【猪猪】【算法】【01背包问题】

【01背包问题】 就是求一定体积size的背包 装若干个有体积w有价值v的物品,如何装才能装得最多的价值Vmax的问题。


js代码:

function bag01(size, items) {
    let m = []; // 定义一个矩阵,行为背包容量,列为物品索引,元素为 背包容量为j且装到物品索引为i时所得的价值总数
    for (let j = 0; j <= size; j++) {
        m[j] = [];
        for (let i = 0; i < items.length; i++) {
            if (j === 0) { // 背包容量为0,装的价值自然为0
                m[j][i] = 0;
                continue;
            }
            if (j < items[i].w) { // 如果背包装得不下索引i的物品,则不装,价值总数和  背包容量为j且装到物品索引为i-1时所得的价值总数 一致
                m[j][i] = m[j][i - 1] || 0;
                continue;
            }
            // 如果背包装的下索引为i物品,价值总数和 为 装得下 和 装不下 两种情况下 的最大值
            // max 第二个参数的式子好理解,和上面一样
            // max 第一个参数的式子 就是 i物品价值 + 背包剩余空间装到i-1物品的价值 之和
            m[j][i] = Math.max((m[j - items[i].w][i - 1] || 0) + items[i].v, m[j][i - 1] || 0);
        }
    }
    return m;
}

mark