贪心算法:学习总结,以及找零问题python代码实现

1.贪心算法

(1)所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
(2)贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

2.贪心算法适用的条件

(1)适用前提:局部最优策略能导致产生全局最优解。
一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

3.示例—找零硬币个数最少

(1)贪心算法

def changegdal(totalmoney):       #找零算法,一共用25、10、1三种面币大小
    numcoins = 0
    if totalmoney >= 25:
        numcoins += totalmoney // 25
        totalmoney = totalmoney % 25
        print(f'25分找了{numcoins}个')

    if totalmoney >= 10:
        numcoins += totalmoney // 10
        print(f'10分找了{totalmoney//10}个')
        totalmoney = totalmoney % 10

    if totalmoney > 0 & totalmoney < 10:
        numcoins += totalmoney
        print(f'1分找了{totalmoney}个')

    print(f'一共找硬币{numcoins}个')


changegdal(3)

(2)递归调用:

import time

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)     #加1,是因为后边调用自身减去了一个硬币
            if numCoins < minCoins:
                minCoins = numCoins
        return minCoins

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


if __name__ == '__main__':
    #print(time.perf_counter())          #python3.8不推荐使用time.clock
    #print(recMC([1, 5, 10, 25], 63)
    #print(time.perf_counter())

    print(time.perf_counter())          #python3.8不推荐使用time.clock
    print(recDC([1, 5, 10, 25], 63, [0]*64))
    print(time.perf_counter())          #


猜你喜欢

转载自blog.csdn.net/qq_40797015/article/details/115186412
今日推荐