零錢兌換問題

2021-09-21 18:18:08 字數 1609 閱讀 1256

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