题目描述:
现有的钱币:coins=[1,2,5,7,10]
找零:change(假定为正整数)
求解:如何用最少的钱币进行找零
分析:可以使用动态规划
比如找零8元,可以将问题进行分解
dp[8]=dp[8-coins[j]]+1
即:
dp[8]=dp[8-1]+1=dp[7]+1
dp[8]=dp[8-2]+1=dp[6]+1
dp[8]=dp[8-5]+1=dp[3]+1
dp[8]=dp[8-7]+1=dp[1]+1
初始化:
dp=[change+1]*(change+1) #对应的dp[0],dp[1],dp[2]...dp[change]
dp[0]=0 #因为找0元需要0张钱币
使用的钱币初始化:
coins_used=[0]*(change+1)
代码:
def coin_change(coins,change,dp,coins_used):
'''利用动态规划求解找零需要的钱币张数,以及钱币的使用情况'''
for i in range(1,change+1):
#依次求解,dp[1]~dp[change]
for j in range(len(coins)):
if coins[j]<=i:
#使用这张钱币的前提,纸币的金额数<=需要找零的金额,比如:找零8块,不能使用10块的钱币
if dp[i-coins[j]]+1<dp[i]:
#dp[i]=min(dp[i],dp[i-coins[j]]+1)
dp[i]=dp[i-coins[j]