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 輸出 ...