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