设有1,2,5三种面值的零钱,凑齐11元,最少需要几枚硬币
使用动态规划来解决这个问题。
一、递归法
#凑零钱
def coinChange(coins,amount):
def dp(n):
if n==0: #base case
return 0
if n<0:
return -1
res=float('inf') #由于获取的值为最少需要几枚硬币,所以初始化为无穷大
for coin in coins:
subproblem=dp(n-coin)
if subproblem==-1:
continue
res=min(res,1+subproblem) #1代表加一枚硬币
return res if res!=float('inf') else -1
return dp(amount)
coins=[1,2,5]
amount=11
s=coinChange(coins,amount)
print(s)
二、数组实现
coins=[1,2,5]
dp=[11 for i in range(12)] #设置一个数组记录子问题的结果
dp[0]=0
for i in range(len(dp)):
for coin in coins:
if i-coin<0:
continue
dp[i]=min(dp[i],1+dp[i-coin])
if dp[11]==-1:
print(-1)
else:
print(dp[11])