题目描述:
现有的钱币: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]]+1change:
#无解的情况,初始化的时候设置dp[change]=change+1
return -1
else:
return dp[change]
def used_coins(change,used_coins):
'''利用used_coins求解使用的钱币'''
re=[]
while change:
#dp[i]=dp[i-coins[j]]+1 used_coins[change]=coins[j]
tmp=used_coins[change]
re.append(tmp)
change-=tmp
return re
if __name__=='__main__':
#初始化
coins=[1,2,5,7,10]
change=16
dp=[change+1]*(change+1)
dp[0]=0
coins_used=[0]*(change+1)
re=coin_change(coins,change,dp,coins_used)
re_coins=used_coins(change,coins_used)
print("找零{0}元需要{1}张钱币,分别是{2}".format(change,re,re_coins))
执行结果:
找零16元需要3张钱币,分别是[1, 5, 10]