小鱼要学数据结构与算法(基于python)—Day8优化问题与策略

解决问题的策略

在这里插入图片描述

一、知识概览

本章首先引入了分治策略,之后重点介绍了找零兑换问题,分别讲解了贪心策略,递归解法和动态规划解法。
知识概览

二、找零兑换问题

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]

可以看到速度有了极大提升

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章