給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:你可以認為每種硬幣的數量是無限的。
思路,最小問題,可考慮動態規劃,假設dp[i]表示金額為i的最少硬幣組成個數,則dp[i]=min(dp[i],dp[i-coin]+1);如果i>=coin的話,其中coin為coins中的硬幣種類。**如下:
c++:
class solution }}
return dp[amount]==amount+1 ? -1:dp[amount];
}};
python:
class solution:
def coinchange(self, coins: list[int], amount: int) -> int:
if amount==0:return 0
dp=[amount+1 for i in range(amount+1)]
dp[0]=0
for i in range(1,amount+1):
for coin in coins:
if(i>=coin):
dp[i]=min(dp[i],dp[i-coin]+1)
return -1 if dp[amount]==amount+1 else dp[amount]
與該題類似可擴充套件為某數可由某個陣列中的數組成,求解所需要的最短個數,如下例題所示:
給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。
示例 1:
輸入: n = 12
輸出: 3
解釋: 12 = 4 + 4 + 4.
示例 2:
輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.
思路一,該題與零錢兌換十分相似,因此可採取上述動態規劃思路來求解。
class solution
}return dp[n];
}};
思路二,該演算法用到了數學知識,即每個數都可用不超過4個的平方數組成,即四平方定理,其推論為n=4^a*(8b+7),對於每個數都成立。4的倍數的數均可由相同個數的數組成,因此先對數n減小處理,如果某個數能由8b+7組成,則其最少由4個平方數組成,接下來再進行判斷該數是否能由兩個平方數或乙個平方數組成,若均不符合,則該數最少由3個數組成。**如下:
class solution
a++;
}return 3;
}};
leetCode 零錢兌換問題
零錢兌換問題 已知各種金幣面值costs i 每種面值可無限使用 求兌換出指定金額target的最小錢幣數。此題有dfs等的解法,這裡只介紹完全揹包的解法 先上狀態轉移方程 f i v 表示處理前i種錢幣時,剛好兌換面值為v時的錢幣數,則 f i v min 上述方程簡化為一維陣列實現 可參考我的揹...
零錢兌換 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 輸出 ...