解决问题的策略
一、知识概览
本章首先引入了分治策略,之后重点介绍了找零兑换问题,分别讲解了贪心策略,递归解法和动态规划解法。
二、找零兑换问题
2.1递归解法
#找零兑换问题
##递归解法
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
import time
print(time.clock())
print(recMC([1,5,10,20,50,100],63))
print(time.clock())
输出
3e-07
5
17.6337922
这种解法存在大量重复,非常费时
2.2递归解法优化
下面采用记录最优解的方式优化递归解法
##改进代码
def recDC(coinValueList,change,knownResults):#硬币体系和找零个数
minCoins=change
if change in coinValueList:#最小规模直接返回:正好等于某一硬币的币值
knownResults[change]=1#记录最优解
return 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
memo=[0]*64
print(time.clock())
print(recDC([1,5,10,20,50,100],63,memo))
print(time.clock())
print(memo)
输出
17.6338019
5
17.6339165
[0, 1, 0, 0, 0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 3, 4, 5]
可以看到速度有了极大提升