代码随想录算法训练营第41天 | 01背包问题 二维 、 01背包问题 一维 、 416. 分割等和子集

如果是直接从来没听过背包问题,可以先看文字讲解慢慢了解 这是干什么的。
如果做过背包类问题,可以先看视频,很多内容,是自己平时没有考虑到位的。
背包问题,力扣上没有原题,大家先了解理论,今天就安排一道具体题目。

详细布置

01背包问题 二维
https://programmercarl.com/背包理论基础01背包-1.html
视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6

二维比较好理解
function testWeightBagProblem (weight, value, size) {
    const dp = new Array(weight.length).fill(0).map(()=>new Array(size+1).fill(0));
    for (i=weight[0];i<=size;i++) {
        dp[0][i] = value[0];
    }

    for (let i=1;i<weight.length;i++) {
        for (let j=0;j<=size;j++) {
            if (j<weight[i]) {
                dp[i][j] = dp[i-1][j];
            } else {
                dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
            }
        }
    }
    console.table(dp)
    return dp[weight.length-1][size]
}
``

 01背包问题 一维 
https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-2.html  
视频讲解:https://www.bilibili.com/video/BV1BU4y177kY  

一维难理解,主要理解为什么要从后遍历,因为从前遍历有可能会把前面的物品添加多次
从二维数组推导公式来看一维数组,dp[i]的值需要依靠上一组数组的dp[i-1]的值,如果从前往后遍历,就会有问题
另外j为什么要大于等于wight[i],因为j是容量,如果小于,其实就完全复制就行,不用计算
function testWeightBagProblem2(wight, value, size) {
const len = wight.length;
const dp = new Array(size+1).fill(0);

for (let i=0;i<len;i++) {
    for (let j=size;j>=wight[i];j--) {
        dp[j] = Math.max(dp[j], dp[j - wight[i]]+value[i]);
    }
    console.log(dp)
}
console.log(dp)
return dp[size];

}


 416. 分割等和子集  
本题是 01背包的应用类题目
https://programmercarl.com/0416.%E5%88%86%E5%89%B2%E7%AD%89%E5%92%8C%E5%AD%90%E9%9B%86.html    
视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE

/**

  • @param {number[]} nums

  • @return {boolean}
    */
    var canPartition = function(nums) {
    let total = 0;
    for (let i=0;i<nums.length;i++) {
    total+=nums[i];
    }

    if (total%2 === 1) return false;
    const dp = new Array(total/2 + 1).fill(0);
    for (let i=0;i<nums.length;i++) {
    for(let j=total/2;j>=nums[i];j--){
    dp[j] = Math.max(dp[j], dp[j-nums[i]]+nums[i]);
    if (dp[j]===total/2) {
    return true;
    }
    }
    }

    return false;
    };

posted @ 2024-06-17 23:59  YuanYF6  阅读(2)  评论(0编辑  收藏  举报