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得到的目標字符串,正好是合法的情況。
具體代碼如下;

