零錢兌換 coin change 動態規劃問題

2021-10-01 04:35:04 字數 2478 閱讀 1745

給定不同面額的硬幣 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] >=0dp[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 輸出 ...