LeetCode题组:第322题-零钱兑换
1.題目
難度:中
給定不同面額的硬幣 coins 和一個(gè)總金額 amount。編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算可以湊成總金額所需的最少的硬幣個(gè)數(shù)。如果沒(méi)有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說(shuō)明:你可以認(rèn)為每種硬幣的數(shù)量是無(wú)限的。
2.我的解答
思路:
- 看題目的問(wèn)法,只問(wèn)最優(yōu)值是多少,沒(méi)有要我們求最優(yōu)解,可以通過(guò)動(dòng)態(tài)規(guī)劃來(lái)解決這個(gè)問(wèn)題;
- 最優(yōu)子結(jié)構(gòu)其實(shí)比較明顯,根據(jù)示例 1:
輸入: coins = [1, 2, 5], amount = 11
湊成面值為 11 的最小硬幣數(shù)可以由以下 3 者的最小值得到:
1、湊成面值為 10 的最小硬幣數(shù) + 面值為 1的這一枚硬幣;
2、湊成面值為 9 的最小硬幣數(shù) + 面值為 2 的這一枚硬幣;
3、湊成面值為 6 的最小硬幣數(shù) + 面值為 5 的這一枚硬幣;
即:dp[11] = min (dp[10] + 1, dp[9] + 1, dp[6] + 1)。
可以直接把題目的問(wèn)法設(shè)計(jì)成狀態(tài)。
第 1 步:定義「狀態(tài)」
dp[i]:湊齊總價(jià)值i需要的最少硬幣數(shù),狀態(tài)就是問(wèn)的問(wèn)題。
第 2 步:寫(xiě)出「狀態(tài)轉(zhuǎn)移方程」
根據(jù)對(duì)具體例子的分析:
dp[amount] = min(1 + dp[amount - coin[i]]) for i in [0, len - 1] if coin[i] <= amount
看到代碼實(shí)現(xiàn)
//動(dòng)態(tài)規(guī)劃 int coinChange(int* coins, int coinsSize, int amount){int i,j;int *dp=(int *)malloc(sizeof(int)*(amount+1));//dp[i]代表i金額最小的memset(dp,-1,sizeof(int)*(amount+1));//初始化//將硬幣值的大小當(dāng)做dp數(shù)組的下標(biāo)for(i=0;i<coinsSize&&coins[i]<=amount;i++) dp[coins[i]]=1;dp[0]=0;for(i=0;i<=amount;i++)//狀態(tài)轉(zhuǎn)移方程{ int number=amount+1;//逐個(gè)比較i-coins[j]所需的最小硬幣數(shù)for(j=0;j<coinsSize;j++){//如果硬幣可用if(i-coins[j]>=0&&dp[i-coins[j]]!=-1)number=dp[i-coins[j]]<number ? dp[i-coins[j]]+1 : number;}if(number!=amount+1) dp[i]=number;}return dp[amount]; }總結(jié)
以上是生活随笔為你收集整理的LeetCode题组:第322题-零钱兑换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode题组:第836题-矩形叠
- 下一篇: 一行代码制作你的专属动态二维码-Pyth