代碼隨想錄day42【動(dòng)態(tài)規(guī)劃】0-1背包問題 分割等和求子集 目標(biāo)和

01背包理論基礎(chǔ)

解法一:
暴力解法:每種物品有取/不取兩種狀態(tài)。
時(shí)間復(fù)雜度:O(2n)
解法二:
動(dòng)態(tài)規(guī)劃: 二維數(shù)組

  1. dp[i][j]含義:[0,i]物品抓艳,任取,背包容量為j帚戳,能取得的最大價(jià)值
  2. 遞推公式:兩種方式推到至下一步玷或。
    • 不放物品i:由dp[i - 1][j]推出,即背包容量為j片任,里面不放物品i的最大價(jià)值偏友,此時(shí)dp[i][j]就是dp[i - 1][j]。(其實(shí)就是當(dāng)物品i的重量大于背包j的重量時(shí)蚂踊,物品i無法放進(jìn)背包中约谈,所以被背包內(nèi)的價(jià)值依然和前面相同。)
  • 放物品i:由dp[i - 1][j - weight[i]]推出犁钟,dp[i - 1][j - weight[i]] 為背包容量為j - weight[i]的時(shí)候不放物品i的最大價(jià)值棱诱,那么dp[i - 1][j - weight[i]] + value[i] (物品i的價(jià)值),就是背包放物品i得到的最大價(jià)值

dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

  1. 初始化
    觀察可知:下一步數(shù)值由上一行的數(shù)值得到涝动;因此迈勋,i=0,一定要初始化


    image.png

    dp[i][0]醋粟,均為0靡菇,因?yàn)楸嘲萘繛?
    dp[0][j],即:i為0米愿,存放編號(hào)0的物品的時(shí)候厦凤,各個(gè)容量的背包所能存放的最大價(jià)值。

  2. 確定遍歷順序
    同樣根據(jù)上圖育苟,可知较鼓,先遍歷背包,或先遍歷物品均可
// weight 物品重量
// value 物品價(jià)值
// volumn 背包容量
function maxValue(weight, value, volumn) {
  let n = weight.length; //物品個(gè)數(shù)
  let dp = new Array(n).fill(0).map((ele) => {
    return new Array(volumn + 1).fill(0);
  });

  // 初始化
  for (let j = 0; j <= volumn; j++) {
    dp[0][j] = value[0];
  }
  for (let i = 0; i < n; i++) {
    dp[i][0] = 0;
  }

  for (let i = 1; i < n; i++) {
    for (let j = 1; j <= volumn; j++) {
      if (j - weight[i] < 0) {
        dp[i][j] = dp[i - 1][j];
      } else {
        dp[i][j] = Math.max(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);
      }
    }
  }

  // 打印
  for (let i = 0; i < n; i++) {
    let str = "";
    for (let j = 0; j <= volumn; j++) {
      str += dp[i][j] + " ";
    }
    console.log(str);
  }

  return dp[i][j]
}

// test
maxValue([1, 3, 4], [15, 20, 30], 4);
// 結(jié)果
// 0 15 15 15 15
// 0 15 15 20 35
// 0 15 15 20 35

解法三:動(dòng)態(tài)規(guī)劃:一維dp數(shù)組

  1. dp數(shù)組含義dp[i]:容量為i的背包的最大價(jià)值
  2. 遞推公式:dp[i]=max( dp[i],dp[i-Wi-1]+Vi)
  3. 初始化:dp均為0
  4. 遍歷順序:只能先物品后背包违柏,背包為倒序
    倒序原因:dp數(shù)組是重復(fù)利用的博烂。且因?yàn)樵诙S數(shù)組中,dp[i][j]是依據(jù)上一行的左邊推導(dǎo)出來的漱竖,所以一維數(shù)組應(yīng)該從右向左(倒序)遍歷禽篱。倒序才能真的拿到原來左側(cè)的舊值
function maxValue2(weight, value, volumn) {
  let n = weight.length; //物品數(shù)量
  let dp = new Array(volumn + 1).fill(0);
  for (let i = 0; i < n; i++) {
    for (let j = volumn; j >= 0; j--) {
      if (j - weight[i] >= 0) {
        dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
      }
    }
  }
  console.log(dp); //[ 0, 15, 15, 20, 35 ]
  return dp[volumn]
}
maxValue2([1, 3, 4], [15, 20, 30], 4);

分割等和求子集

力扣題目
本質(zhì):01背包的應(yīng)用。將子集看作是物品馍惹,物品的重量與價(jià)值均為元素的值躺率,看其是否能找到dp[num]===target/2

遞推公式:
dp[j]=max(dp[j],dp[j-num[i]]+num[i])
初始化:
dp均為0玛界。

var canPartition = function(nums) {
    let sum = nums.reduce((p, c) => {
    return p + c;
  }, 0);

  if (sum % 2 !== 0) {
    return false;
  }

  let volumn = sum / 2; //背包容量
  let n = nums.length; //物品個(gè)數(shù)
  let dp = new Array(volumn + 1).fill(0);//初始化

  for (let i = 0; i < n; i++) {
    for (let j = volumn; j >= 0; j--) {
      if (j - nums[i] >= 0) {
        dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
      }
    }
  }

  return dp[volumn] === sum / 2;
};

目標(biāo)和

力扣題目鏈接
分析:背包問題的應(yīng)用
其實(shí)是求裝滿有幾種方法,是一個(gè)組合問題肥照。
轉(zhuǎn)換為背包問題:
假設(shè)加法的總和為x脚仔,那么減法對(duì)應(yīng)的總和就是sum - x。
所以我們要求的是 x - (sum - x) = target
x = (target + sum) / 2
此時(shí)問題就轉(zhuǎn)化為舆绎,裝滿容量為x的背包,有幾種方法们颜。

  1. dp數(shù)組含義:裝滿容量為j(包括j)的包吕朵,有dp[j]種方法
  2. 遞推公式:dp[j] += dp[j - nums[i]]
    (補(bǔ)充:所以求組合類問題的公式,都是類似這種遞推公式)
  3. 初始化:
    dp[0]=1
    例如:需帶入例子窥突。數(shù)組[0] 努溃,target = 0,那么 bagSize = (target + sum) / 2 = 0
var findTargetSumWays = function(nums, target) {
    let sum=nums.reduce((p,c)=>p+c)
    if(Math.abs(target) > sum) {
        return 0;
    }

    if((target + sum) % 2) {
        return 0;
    }
    
    let bagSize= Math.floor((sum+target)/2)
    let dp=new Array(bagSize+1).fill(0)
    dp[0]=1

    for(let i=0;i<nums.length;i++){
        for(let j=bagSize;j>=nums[i];j--){
            dp[j] += dp[j-nums[i]]
        }
    }
    return dp[bagSize]
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阻问,一起剝皮案震驚了整個(gè)濱河市梧税,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌称近,老刑警劉巖第队,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刨秆,居然都是意外死亡凳谦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門衡未,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尸执,“玉大人,你說我怎么就攤上這事缓醋∪缡В” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵送粱,是天一觀的道長(zhǎng)褪贵。 經(jīng)常有香客問我,道長(zhǎng)葫督,這世上最難降的妖魔是什么竭鞍? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮橄镜,結(jié)果婚禮上偎快,老公的妹妹穿的比我還像新娘。我一直安慰自己洽胶,他們只是感情好晒夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布裆馒。 她就那樣靜靜地躺著,像睡著了一般丐怯。 火紅的嫁衣襯著肌膚如雪喷好。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天读跷,我揣著相機(jī)與錄音梗搅,去河邊找鬼。 笑死效览,一個(gè)胖子當(dāng)著我的面吹牛无切,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丐枉,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼哆键,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瘦锹?” 一聲冷哼從身側(cè)響起籍嘹,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弯院,沒想到半個(gè)月后辱士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抽兆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年识补,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辫红。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凭涂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贴妻,到底是詐尸還是另有隱情切油,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布名惩,位于F島的核電站澎胡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娩鹉。R本人自食惡果不足惜攻谁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弯予。 院中可真熱鬧戚宦,春花似錦、人聲如沸锈嫩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艳汽,卻和暖如春猴贰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背河狐。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工米绕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馋艺。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓义郑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丈钙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容