算法進階——貪心與動態規劃

貪心算法

  貪心算法(又稱貪婪算法)是指,在對問題求解時,老是作出在當前看來是最好的選擇。也就是說,不從總體最優上加以考慮,他所作出的是在某種意義上的局部最優解。
  貪心算法不是對全部問題都能獲得總體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具有無後效性,即某個狀態之前的過程不會影響之後的狀態,只與當前狀態有關。
貪心算法基本要素:
  1. 談心選擇:貪心選擇是指所求問題的總體最優解能夠經過一系列局部最優的選擇,即貪心選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態規劃算法的主要區別。貪心選擇是採用從頂向下、以迭代的方法作出相繼選擇,每作一次貪心選擇就將所求問題簡化爲一個規模更小的子問題。對於一個具體問題,要肯定它是否具備貪心選擇的性質,咱們必須證實每一步所做的貪心選擇最終能獲得問題的最優解。一般能夠首先證實問題的一個總體最優解,是從貪心選擇開始的,並且做了貪心選擇後,原問題簡化爲一個規模更小的相似子問題。而後,用數學概括法證實,經過每一步貪心選擇,最終可獲得問題的一個總體最優解。
  2. 最優子結構:當一個問題的最優解包含其子問題的最優解時,稱此問題具備最優子結構性質。運用貪心策略在每一次轉化時都取得了最優解。問題的最優子結構性質是該問題可用貪心算法或動態規劃算法求解的關鍵特徵。貪心算法的每一次操做都對結果產生直接影響,而動態規劃則不是。貪心算法對每一個子問題的解決方案都作出選擇,不能回退;動態規劃則會根據之前的選擇結果對當前進行選擇,有回退功能。動態規劃主要運用於二維或三維問題,而貪心通常是一維問題

貪心算法基本思路:算法

  貪心算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能得到局部最優解。每一步只考慮一個數據,他的選取應該知足局部優化的條件。若下一個數據和部分最優解連在一塊兒再也不是可行解時,就不把該數據添加到部分解中,直到把全部數據枚舉完,或者不能再添加算法中止編程

例題一: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字符串

 

 

動態規劃

相關文章
相關標籤/搜索