LeetCode 零錢兌換,個人理解

2021-10-10 07:38:05 字數 1181 閱讀 1164

今天在leetcode上練了下零錢兌換

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

ps:可以認為每種硬幣的數量是無限的

這個屬於完全揹包型別問題,我們可以通過動態規劃,去解決該問題動態規劃的定義我就不重複了. 下面我直接貼出答案

int

coins =

;public

intcoinchange

(int

coins,

int amount)

}return dp[amount]

== integer.max_value ?-1

: dp[amount]

;}

自下而上找出子問題的最優解,先計算出需要總金額之前的最優解;

dp陣列儲存了子問題的最優解,如圖,如果我們要找到11的最優解,那麼我們應該從不同價值硬幣分別找到最優解

curramount是當前需要求出需要最少硬幣的金額(即子問題)

+1 是因為 dp[leftamount]是其他子問題的最優解,應該再加上乙個硬幣,才是當前要求的答案

會迴圈硬幣面額的陣列,以此找到不同子問題的最優解,找到需要最少數量硬幣的答案

下面是我把執行邏輯進行了推導

對於紅色區域無解內容,我們通過下面**進行規避,也就是剪枝

if (leftamount < 0 || dp[leftamount] == integer.max_value) continue;

這樣看可能直觀感受不到,你可以想象反過來(amount在最下面),這樣可能會清晰一點

演算法小抄: 動態規劃系列

零錢兌換 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...

leetcode零錢兌換

1.遞迴 回溯 記錄每種錢幣能夠使用的最大數量,然後遍歷每一種情況,求錢幣數量最小的,但會超時 2.動態規劃 設定dp amount 1 初始值設為0x3f3f3f3f,即為無窮大 dp i 表示總量是i是,coins中的金幣組成i所需的最小金幣個數 此處以錢幣為1 2 5,總額是11舉例 dp 1...

LeetCode 零錢兌換

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