力扣刷題筆記10-01背包系列


1.零錢兌換

 

 

 解題思路:

1.dp[j]代表含義:填滿容量為j的背包最少需要多少硬幣

2.初始化dp數組:因為硬幣的數量一定不會超過amount,,因此初始化數組值為amou+1;dp[0] = 0

3.轉移方程:dp[j] = min(dp[j], dp[j - coin[i]] + 1)當前填滿容量j最少需要的硬幣 = min( 之前填滿容量j最少需要的硬幣, 填滿容量 j - coin[i] 需要的硬幣 + 1個當前硬幣)

4.返回dp[amount],如果dp[amount]的值為amou+1沒有變過,說明找不到硬幣組合,返回-1.

5.注意,這道題硬幣組合可重復取,所以要從前往后遍歷錢的數值

 

代碼如下:

 

 

 

2.零錢兌換||

 

 

 解題思路:

1.dp[j]代表含義:最多有幾種方式可以湊成總錢數j;

2.初始化dp數組:dp[0] = 1,因為0元錢肯定有1種方式可以湊成

3.轉移方程:dp[j] = dp[j]+dp[j - coin[i]] :

4.返回dp[amount]

5.注意,這道題硬幣組合可重復取,所以要從前往后遍歷錢的數值

具體代碼如下:

 

 

 

3.一和零

 

 

 解題思路:

這道題還是0-1背包問題,具體的解題思路和第1題差不多,但是有兩點不同:一是這道題是二維背包問題,一個是不能超過0的個數,一個是不能超過1的個數

                                                                                                                          二是這道題strs中字符串不可重復選取,所以遍歷0和1的個數時候,要從后往前遍歷

 

具體代碼如下:

 

 

 

 4.最后一塊石頭的重量

 

 解題思路:

這道題的意思就是如何把數組中的所有元素分成倆部分,使這倆部分的總和的差值最小。很明顯這也是0-1背包問題的變種,我們可以首先可以

求出數組元素的總和,在這里我們記為sum。然后我們遍歷數組中元素,找到一種組合,該組合的總和能最大限度接近sum/2,最后的結果即為

sum-2*該組合的總和。因為這道題數組中的元素不可以重復取,所有也是從后往前遍歷。

具體代碼如下:

 

 5.數位成本和目標值最大的數字

 

 

 

 解題思路:這是一道完全背包問題,並且cost數組中的元素可重復取(從前往后遍歷target),

①因為i遍歷的順序是從小到大,就保證了整數的高位一定大於等於整數的低位,也就保證了整數最大;

②為了保證我們dp[j]中的數位的cost相加一定等於j,而沒有小於j的情況,我們特地用字符串"#"來表示無法得到的目標值(完全背包),這樣我們在進行狀態轉移的時候,就不會進行不合法的轉移;

③而為了得到我們的目標值,進行正確的狀態轉移,我們又需要把dp[0]初始化為“”,因為對於任何cost的值來說,加上0都是剛好花費cost得到的目標字符串,正好是合法的情況。

 

具體代碼如下;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM