leetcode揹包問題 等分陣列

2021-10-09 10:17:31 字數 1597 閱讀 4428

對於這個問題,看起來和揹包沒有任何關係,為什麼說它是揹包問題呢? ⾸先回憶⼀下揹包問題⼤致的描述是什麼: 給你⼀個可裝載重量為 w 的揹包和 n 個物品,每個物品有重量和價值兩 個屬性。其中第 i 個物品的重量為 wt[i] ,價值為 val[i] ,現在讓你⽤ 這個揹包裝物品,最多能裝的價值是多少? 那麼對於這個問題,我們可以先對集合求和,得出 sum ,把問題轉化為背 包問題:

經典動態規劃:⼦集揹包問題

給⼀個可裝載重量為 sum / 2 的揹包和 n 個物品,每個物品的重量為 nums[i] 。現在讓你裝物品,是否存在⼀種裝法,能夠恰好將揹包裝滿? 你看,這就是揹包問題的模型,甚⾄⽐我們之前的經典揹包問題還要簡單⼀ 些,下⾯我們就直接轉換成揹包問題,開始套前⽂講過的揹包問題框架即 可。 ⼆、解法分析 第⼀步要明確兩點,「狀態」和「選擇」。 這個前⽂ 經典動態規劃:揹包問題 已經詳細解釋過了,狀態就是「揹包的 容量」和「可選擇的物品」,選擇就是「裝進揹包」或者「不裝進揹包」。 第⼆步要明確 dp 陣列的定義。 按照揹包問題的套路,可以給出如下定義: dp[i][j] = x 表⽰,對於前 i 個物品,當前揹包的容量為 j 時,若 x 為 true ,則說明可以恰好將揹包裝滿,若 x 為 false ,則說明不能恰 好將揹包裝滿。 ⽐如說,如果 dp[4][9] = true ,其含義為:對於容量為 9 的揹包,若只是 ⽤錢 4 個物品,可以有⼀種⽅法把揹包恰好裝滿。 或者說對於本題,含義是對於給定的集合中,若只對前 4 個數字進⾏選擇, 存在⼀個⼦集的和可以恰好湊出 9。 根據這個定義,我們想求的最終答案就是 dp[n][sum/2] ,base case 就是 dp[…][0] = true 和 dp[0][…] = false ,因為揹包沒有空間的時候,就相 當於裝滿了,⽽當沒有物品可選擇的時候,肯定沒辦法裝滿揹包。 第三步,根據「選擇」,思考狀態轉移的邏輯。 回想剛才的 dp 陣列含義,可以根據「選擇」對 dp[i][j] 得到以下狀態 轉移: 經典動態規劃:⼦集揹包問題

106如果不把 nums[i] 算⼊⼦集,或者說你不把這第 i 個物品裝⼊揹包,那 麼是否能夠恰好裝滿揹包,取決於上⼀個狀態 dp[i-1][j] ,繼承之前的結 果。 如果把 nums[i] 算⼊⼦集,或者說你把這第 i 個物品裝⼊了揹包,那麼 是否能夠恰好裝滿揹包,取決於狀態 dp[i - 1][j-nums[i-1]] 。 ⾸先,由於 i 是從 1 開始的,⽽陣列索引是從 0 開始的,所以第 i 個物 品的重量應該是 nums[i-1] ,這⼀點不要搞混。 dp[i - 1][j-nums[i-1]] 也很好理解:你如果裝了第 i 個物品,就要看背 包的剩餘重量 j - nums[i-1] 限制下是否能夠被恰好裝滿。 換句話說,如果 j - nums[i-1] 的重量可以被恰好裝滿,那麼只要把第 i 個物品裝進去,也可恰好裝滿 j 的重量;否則的話,重量 j 肯定是裝不 滿的。 最後⼀步,把偽碼翻譯成**,處理⼀些邊界情況。

狀態壓縮之後的

class

solution

sum=sum/2;

vector

dp(sum+1,

false);

dp[0]

=true

;for

(int i=

0;i)return dp[sum];}

};

揹包問題 分數揹包

分數揹包與01揹包問題不同點就是如果某物品無法被全部放入可以放入一部分 思路還是降序排列然後往揹包新增 題目 有 m 元錢,n 種物品 每種物品有 j 磅,總價值 f 元,可以使用 0 到 f 的任意 購買相應磅的物品,例如使用 0.3f 元,可以購買 0.3j 磅物品。要求輸出用 m 元錢最多能買...

0 1揹包 分數揹包

題目出自北航oj 時間限制 2000ms 記憶體限制 65536kb 朋友,你渴望力量嗎?不渴望謝謝。那朋友,你想要濃密的頭髮嗎?想。bamboo停下腳步望了望角落裡的巫師 你這不是變小藥嗎?還是盜版?喂,是110嗎?巫師趕緊解釋 不是,你仔細看,我這巴拉拉魔髮藥水是膠體形態的 汲取魔仙堡的時光泉水...

Leetcode揹包問題

題意 幾種無限數量的硬幣,湊成amount的方案數,方案是無序的,即1 2 和 2 1算同一種 題解 方法一 經典揹包解法 dp i j 表示前i個物品湊出j的方案數,考慮第i個選與不選兩種情況,其中選的時候,再考慮選擇第i個物品的次數。class solution return dp n amou...