動態規劃2 硬幣找零問題

2022-08-24 22:06:15 字數 1700 閱讀 4638

目錄最少硬幣——leetcode

題目描述:給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。(你可以認為每種硬幣的數量是無限的。)

解法:動態規劃

對於乙個金額,與它的差值為硬幣庫(coins)中硬幣面值的數都是它一步就可以到達的,這裡一步到達是指只需要乙個硬幣就能解決。因此,對於乙個金額,能夠滿足題目要求的硬幣數為所有能夠一步到達這個它的金額所需的硬幣數加1。

dp = [float("inf") for i in range(amount+1)] #初始化dp陣列

dp[0] = 0 # 當amount=0時,硬幣所需數為0

for i in range(1, amount + 1):

for coin in coins:

if i - coin >= 0:

dp[i] = min(dp[i], dp[i - coin] + 1)

if dp[-1] == float("inf"):

return -1

else:

return dp[-1]

題目描述:給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成[1, amount]中所有面值所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。(你可以認為每種硬幣的數量是無限的。

這種情況比上面情況稍微複雜一點,因為要組成所有範圍內的面值。如圖所示:

**如下:

class solution:

def coinchange(self, coins: list[int], amount: int) -> int:

dp = [float("inf") for i in range(amount+1)] #初始化dp陣列

dp[0] = 0 # 當amount=0時,硬幣所需數為0

if 1 not in coins: # 如果硬幣裡面沒有面值為1的硬幣,則無法組成所有的硬幣

return -1

dp[1] = 1

for i in range(2,amount+1):

min_ = dp[i]

for j in range(1,i):

if j in coins and j<=i-j+1: # 如果另一部分直接可以用乙個硬幣代替

min_ = min(min_, dp[i-j]+1)

else:

min_ = min(min_,dp[i-j]+dp[j])

dp[i]=min_

return dp[-1]

硬幣找零問題(動態規劃)

給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...

硬幣找零問題 動態規劃問題

看到了 這文章,由於我不太懂他的 所以我按他的題和思路,寫了 思路我就不寫了,就是動態規劃的思路,先保證區域性最優,再慢慢向全區域性最優 include include include include using namespace std const int m 100 int coinsum m...

動態規劃 硬幣找零

時間限制 1000 ms 記憶體限制 65535 kb 描述在現實生活中,我們經常遇到硬幣找零的問題,例如,在發工資時,財務人員就需要計算最少的找零硬幣數,以便他們能從銀行拿回最少的硬幣數,並保證能用這些硬幣發工資。我們應該注意到,人民幣的硬幣系統是 100,50,20,10,5,2,1,0.5,0...