win10+python3.8
问题:自定义硬币体系,最少找零数
#找零递归
def recMC(coinValueList,change):
minCoins = change
if change in coinValueList:
return 1
else:
for i in [c for c in coinValueList if c <= change] :
numCoins = 1 + recMC(coinValueList,change -i)
if numCoins < minCoins:
minCoins = numCoins
return minCoins
print(recMC([1,5,10,21,25],63))
#找零加缓存改进
def recDC(coinValueList,change,knownResults):
minCoins = change
if change in coinValueList :
knownResults[change] = 1
elif knownResults[change] >0 :
return knownResults[change]
else:
for i in [c for c in coinValueList if c <= change]:
numCoins = 1 +recDC(coinValueList, change - i ,knownResults )
if numCoins <minCoins :
minCoins = numCoins
knownResults[change] = minCoins
return minCoins
print(recDC([1,5,10,25],63,[0]*64))
#找零动态规划
def deMakeChange(coinValueList,change,minCoins):
for cents in range(1,change +1):
coinCount = cents
for j in [c for c in coinValueList if c <= cents]:
if minCoins[cents - j] + 1 < coinCount :
coinCount = minCoins[cents - j ] + 1
minCoins[cents] = coinCount
return minCoins[change]
print(deMakeChange([1,5,10,21,25],63,[0]*64))