貪心算法基本思路:算法
貪心算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能得到局部最優解。每一步只考慮一個數據,他的選取應該知足局部優化的條件。若下一個數據和部分最優解連在一塊兒再也不是可行解時,就不把該數據添加到部分解中,直到把全部數據枚舉完,或者不能再添加算法中止編程
例題一:ide
假設商店老闆要找零n元錢,錢幣面額有:100元、50元、20元、5元、1元,如何找零使得所需錢幣的數量最少?優化
#假設商店老闆須要找零n元錢,錢幣的面額有:100元、50元、20元、5元、1元,如何找零使得所需錢幣的數量最少? money = [100,50,20,5,1] def change_money(x): change = [0,0,0,0,0] for i,m in enumerate(money): change[i] = x // money[i] x = x % money[i] if x > 0: print("還剩%s" % x) return change print(change_money(356.2))
例題二:spa
一輛汽車加滿油後可行駛n千米,旅途中有k個加油站,加油站之間的距離存放在列表l中。汽車要怎麼停靠加油才能使加油次數最少?設計
#一輛汽車加滿油後可行駛n千米。旅途中有k個加油站。設計一個有效算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。 #對於給定的n(n <= 5000)和k(k <= 1000)個加油站位置,編程計算最少加油次數。 def greedy(n,k,l): num = 0 # 表示加油次數 for i in range(k): if l[i] > n: print('no solution') # 若是距離中獲得任何一個數值大於n 則沒法計算 return i, s = 0, 0 # 利用s進行迭代 while i <= k: s += l[i] if s >= n: # 當局部和大於n時則局部和更新爲當前距離 s = l[i] # 貪心意在令每一次加滿油以後跑儘量多的距離 num += 1 i += 1 print(num) if __name__ == '__main__': n = 100 k = 5 l = [50, 80, 39, 60, 40, 32] # 表示加油站之間的距離 greedy(n,k,l)
例題三:code
有n個非負整數,將其按照字符串拼接的方式拼接爲一個整數。如何拼接能夠使得獲得的整數最大?如何拼接能夠使得獲得的整數最小?blog
例:32,94,128,1286,6,71能夠拼接出的最大整數爲94716321286128,最小整數爲12812863267194字符串