背包问题-动态规划:0-1背包、完全背包和多重背包的JS实现

1,233 阅读1分钟

参考

背包问题:给定一组有固定价值和固定重量的物品,以及一个已知最大承重量的背包,求在不超过背包最大承重量的前提下,能放进背包里面的物品的最大总价值。这一类问题是典型的使用动态规划解决的问题。

1.0-1背包:指每一种物品都只有一件,可以选择放或者不放。

function bag(weight, value, target) {
        const len = weight.length
        // 1.初始化dp数组
        const dp = Array(target + 1).fill(0)
        dp[0] = 0
        for (let i = weight[0]; i <= target; i++) {
            dp[i] = value[0]
        }
        // console.log(dp);
        // 2.状态转移方程
        for (let i = 1; i < len; i++) {
            // 使用一维数组存储,需逆序遍历
            for (let j = target; j >= weight[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])
            }
        }
        return dp[target]
    }
    console.log(bag([2, 2, 6, 5, 4], [6, 3, 5, 4, 6], 10)); // 15

2.完全背包:每种物品都有无限件。

function bag(weight, value, target) {
    const len = weight.length
    // 1.初始化dp数组
    const dp = Array(target + 1).fill(0)
    dp[0] = 0
    // 较0-1背包问题删除第一行的初始化,都需要通过遍历比较进行确定
    // for (let i = weight[0]; i <= target; i++) {
    //     dp[i] = value[0]
    // }
    console.log(dp);
    // 2.状态转移方程
    // 较0-1背包问题修改为从第一行开始遍历
    for (let i = 0; i < len; i++) {
        // 且为顺序遍历
        for (let j = weight[i]; j <= target; j++) {
            dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])
        }
    }
    return dp[target]
}
console.log(bag([2, 2, 6, 5, 4], [6, 3, 5, 4, 6], 10)); // 30

3.多重背包问题:限制了每种物品的个数,解决多重背包问题,只需要把它转化为0-1背包问题即可。