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