湊零錢問題 多種解法 遞迴 動態規劃

2021-10-20 21:22:49 字數 1915 閱讀 4877

題⽬ :

給你 k 種⾯值的硬幣, ⾯值分別為 c1, c2 … ck , 每種硬

幣的數量⽆限, 再給⼀個總⾦額 amount , 問你最少需要⼏枚硬幣湊出這個

⾦額, 如果不可能湊出, 演算法返回 -1。

# -*- coding: utf-8 -*-

"""created on wed mar 3 14:14:19 2021

@author: dujidan

"""from collections import defaultdict

# 遞迴

defcoinchange

(coins, amount)

:def

dp(n)

:#base case

if n ==0:

return

0if n <0:

return-1

#求最小值, 所以初始化為正無窮

res =

float

('inf'

)for coin in coins:

subproblem = dp(n - coin)

if subproblem ==-1

:continue

res =

min(

[res,

1+ subproblem]

)return res if res !=

float

('inf'

)else-1

return dp(amount)

# 遞迴 備忘錄

defcoinchange

(coins, amount)

: meno =

defdp

(n):

# 備忘錄 避免重複計算

if n in meno:

return meno[n]

# base case

if n ==0:

return

0if n <0:

return-1

# 求最小值, 所以初始化為正無窮

res =

float

('inf'

)for coin in coins:

subproblem = dp(n - coin)

if subproblem ==-1

:continue

res =

min(

[res,

1+ subproblem]

) meno[n]

= res if res !=

float

('inf'

)else-1

return meno[n]

return dp(amount)

# 陣列的迭代解法

defcoinchange

(coins, amount)

: dp = defaultdict(

int)

dp[0]

=0for i in

range(1

, amount +1)

: dp[i]

= amount +

1for coin in coins:

if i - coin <0:

continue

dp[i]

=min

([dp[i],1

+ dp[ i - coin]])

return(-

1if dp[amount]==-

1else dp[amount]

)coins =[1

,3,5

]amount =

11print

(coinchange(coins, amount)

)

動態規劃零錢問題

問題 給你 k 種面值的硬幣,面值分別為 c1,c2 ck,每種硬幣的數量無限,再給乙個總金額 amount,問你最少需要幾枚硬幣湊出這個金額,如果不可能湊出,演算法返回 1 比如說 k 3,面值分別為 2,5,10,總金額 amount 11。那麼最少需要 4枚硬幣湊出,即 11 5 2 2 2。...

動態規劃 , 零錢問題。

動態規劃 核心思想,找到最優子結構,組合子問題構成原問題的解。最重要的是,找到最優子結構,這是最難的部分 例題 我們有面值為1元3元5元的硬幣若干枚,如何用最少的硬幣湊夠11元?首先找到問題的子結構 1 選擇硬幣作為子結構變數,第一次選擇只有1元硬幣,求出構成11元硬幣的方案集合a1,第二次選擇有1...

動態規劃 零錢問題 python

零錢問題 暴力遞迴 遞推關係 對arr index 的使用的次數情況進行列舉,for int i 0,arr index i aim,i 對於每乙個i都對應乙個列舉的情況,在該列舉情況下可以重新調整引數,此時可以使用的零錢陣列是arr中index 1開始及之後的陣列部分,新的目標值是aim aim ...