想通過這篇博客來分享一下學習貪心算法和動態規劃的過程
首先什麼是貪心算法?
百度百科給出的釋義是:貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
翻譯成人話就是用簡單粗暴的方式,以最少的代價(佔用的時間和空間),得出結果。
比如某面包店有A、B、C三種大小的麪包,其中A麪包可以提供10點能量售價5元,B麪包可以提供8點能量售價3元,C麪包可以提供2點能量售價1元。現在有一個飢餓的人來到這個麪包店,他需要20點能量值才能喫飽,並且他身上只有10元錢。那麼他要如何選擇麪包?
我們來列舉一下:
A + A = 20點能量
B + B + B = 24點能量
A + C + C + C + C + C = 20點能量值
B + B + C + C = 20點能量
...
像這類問題都有一個特點,那就是解決問題的方法有很多種,那麼我要選哪一種呢?貪心算法給出的答案就是:A+A
因爲它是最快、最簡單的。。。可能這樣說大家不好理解,也可以嘗試另一個理解的方式。
比如我們去超市購物,因爲我們不知道馬上算出自己買的東西價值多少錢,所以我們給收銀員的現金最好是一張100元的RMB。
之所以給100元,是因爲懶。。。因爲你買的這堆東西可能是90元,也可能是40元,亦或者是5元。對應的我們可以選擇給收銀員100元,50元,10元面值的RMB。但這樣做的話。。。我們就很可能遇上自己要多數幾次錢的問題。。。比如你給收銀員10元,但是商品價值40元,那麼會發生什麼?你需要繼續掏錢給收銀員,假設你再給她一張10元的,那麼還是不夠,還要繼續給10元...這樣下去你給錢的操作是不是變多了?那麼買單(運算時間)這個過程是不是就變長了。
那麼假設我們每次都是直接給出我們手裏最大面額的RMB,那麼問題是不是就簡單了?不管這堆商品價值是90元、40元還是5元,我都只需要給一張鈔票就行了,一次解決問題,至於後續的找零問題,跟我有什麼關係?找零不歸顧客管對吧,那是收銀員的工作。這就是貪心算法一個基本原則。用最簡單的方式!
可能又小夥伴會問,假如商品的價值超過100元呢?也很簡單,如果價值超過100元,那麼也是必須先給100元面額的RMB,因爲如果連100元面額都不夠買單,那麼小面額的更加不夠了。所以只能選擇從大往小給。。。所以貪心模式也可以稱爲敗家模式