python 找零问题 动态规划

题目描述:

现有的钱币: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]

 

你可能感兴趣的:(题目训练,python)