Algoritmo codicioso: resumen de aprendizaje e implementación de código python del problema de cambio

1. Algoritmo codicioso

(1) El llamado algoritmo codicioso significa que al resolver un problema, siempre toma la mejor decisión en la vista actual. En otras palabras, sin considerar la optimización general, lo que hizo es solo una solución local óptima en cierto sentido.
(2) El algoritmo codicioso no obtiene la solución óptima general para todos los problemas. La estrategia codiciosa seleccionada no debe tener efectos secundarios, es decir, el proceso después de cierto estado no afectará al estado anterior, sino que solo se relaciona con el estado actual.

2. Condiciones para la aplicación del algoritmo codicioso

(1) Premisa aplicable: la estrategia óptima local puede conducir a la solución óptima global.
Generalmente, para analizar si un problema es adecuado para algoritmos codiciosos, primero puede seleccionar varios datos reales bajo el problema para analizar y luego puede emitir un juicio.

3. Ejemplo: número mínimo de monedas de cambio

(1) Algoritmo codicioso

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) Llamada recursiva:

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())          #


Supongo que te gusta

Origin blog.csdn.net/qq_40797015/article/details/115186412
Recomendado
Clasificación