題⽬ :
給你 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 ...