給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:
你可以認為每種硬幣的數量是無限的。
假設你是個土豪,你有1,5,10,20,50,100的鈔票,你要湊出666買瓶水喝,依據生活經驗,我們一般採取這樣的策略:能用100就用100的,否則就用50的,依此類推,在這種策略下,666=100*6 + 50 1 + 10 1 + 51 + 11, 一共用了10張鈔票。
這種策略就稱為貪心策略:貪心策略是在當前情況下做出最好的選擇,根據需要湊出的金額來進行貪心,但是,如果我們換一組鈔票面值,比如 1, 5, 11,我們要湊出15的時候, 貪心策略就會出錯:
15 = 11 * 1 + 1 * 4 (貪心策略)
15 = 5 * 3(正確策略)
貪心策略**出錯了?
鼠目寸光
重新分析剛剛的例子。w=15時,我們如果取11,接下來就面對w=4的情況;如果取5,則接下來面對w=10的情況。我們發現這些問題都有相同的形式:「給定w,湊出w所用的最少鈔票是多少張?」 接下來,我們用f(n)來表示「湊出n所需的最少鈔票數量」。
那麼,如果我們取了11,最後的代價(用掉的鈔票總數)是多少呢?
明顯 ,它的意義是:利用11來湊出15,付出的代價等於f(4)加上自己這一張鈔票。現在我們暫時不管f(4)怎麼求出來。
依次類推,馬上可以知道:如果我們用5來湊出15,cost就是f(10) + 1 = 2 + 1 = 3 。
那麼,現在w=15的時候,我們該取那種鈔票呢?當然是各種方案中,cost值最低的那乙個
package coin_change;
public
class
solution
dp[0]
=0;// 外層迴圈金額,內層迴圈面值
for(
int i =
1; i <= amount; i++)}
}}return dp[amount];}
public
static
void
main
(string[
] args)
;int amount =14;
for(
int i =
0; i <= amount; i++)}
}
輸出
dp[0] = 0
dp[1] = 1
dp[2] = 1
dp[3] = 2
dp[4] = 2
dp[5] = 1
dp[6] = 2
dp[7] = 1
dp[8] = 2
dp[9] = 2
dp[10] = 1
dp[11] = 2
dp[12] = 2
dp[13] = 3
dp[14] = 2
class
solution
dp[0]
=0;//金額0最優解0
//外層迴圈金額,內層迴圈面值
for(
int i =
1;i<=amount;i++)}
}}return dp[amount];}
};
這裡設定多了乙個面值0.
設dp[0] = 0
dp[1] = 1 + dp[0]
dp[2] = 1 + dp[0]
dp[5] = 1 + dp[0]
dp[7] = 1 + dp[0]
dp[10] = 1 + dp[0]
coins =
設i
代表金額,coins[j]
代表第j個面值的金額:
當i-coins[j] >=0
且dp[i-coins[j]] != -1
時:
j = 0,1,2,3,4;coins[j] = 1,2,5,7,10
dp[i] = getmin(dp[i - coins[j]]) +1
參考–hikes
小象leecode第九課_動態規劃
322 Coin Change零錢兌換問題
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 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...
leedcode 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例1輸入 coins 1,2,5 amount 3 輸出 3 解釋 11 5 5 1示例2輸入 coins 2 amount 3 輸出 ...