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