dp 零錢兌換詳解

2021-10-21 21:21:32 字數 1163 閱讀 8841

dp解題四步驟:

步驟四:空間優化

leetcode322零錢兌換

題目簡介:

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

你可以認為每種硬幣的數量是無限的。

通過考慮特殊情況找出子問題:

如果amount大於或等於所給面值的coins,則可用dp[i] = dp[i-coins[j]] + 1,其中dp[0]需要初始化為0。

此處用了自底向上的dp方法,重在找出這個dp的關係,有特殊情況先從特殊情況進行考慮。

根據dp的狀態方程可知dp的起點應從coins陣列的最小值開始,但是並不能確定最小值為多少,所以從0開始對其進行判斷是否執行該方程即可,由於dp[0]代表amount = 0,所以dp[0] = 0,所以這樣導致了小於coins的最小值的情況都無法對其進行計算,所以這部分應該初始化為-1,這樣使得如(i-coins[j]) < min(coins)的情況下也能得出dp[i] = 0這顯然不正確。

所以第一層判斷條件應該設定為: coins[j]<=i && dp[ i-coins[j] ] != -1

第二層用於更新最優解的判斷條件應該為:dp[i] > dp[i-coins[j]]//dp[i]比正在計算的值要大 || dp[i] == -1//還未計算

class solution}}

}return dp[amount];}

};

由於此題dp的答案並不是由固定位置遞推的變數所確定,所以無法通過幾個變數進行遞推優化。

DP之零錢兌換問題

def coinchange coins,amount 給你的零錢面額 不限數量 要湊的總面額 異常判斷特殊情況 完全不可能有解的情況!if amount 0 return0if len coins 0 return 1 iflen coins 1 and coins 0 amount return...

零錢兌換 leetcode

思路 建乙個動態陣列dp,大小為amount 1,dp裡面的值初始化為amount 1。dp i 表示總金額i最少可以用dp i 的零錢兌換,如果coins j 比i小,那麼總金額i可以由dp i conis j 再加上這枚零錢構成,dp i min dp i dp i coins j 1 如果dp...

leedcode 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例1輸入 coins 1,2,5 amount 3 輸出 3 解釋 11 5 5 1示例2輸入 coins 2 amount 3 輸出 ...