通過金礦模型介紹動態規劃
******************************===
附:首先我們思考乙個問題,如何用最少的硬幣揍夠i元(i<11)?為什麼要這麼問呢?兩個原因:1、當我們遇到乙個大問題時,總是習慣把問題的規模變小,這樣便於分析討論。2.這個規模變小後的問題和原來的問題是同質的,除了規模變小,其它的都是一樣的,本質上它還是同乙個問題規模變小後的問題其實是原問題的子問題)。
好了,讓我們從最小的i開始吧。當i=0,即我們需要多少個硬幣來於湊夠0元。由於1,3,5都大於0,即沒有比1小的幣值,因此湊夠0元我們最少需要0個硬幣。(這個分析很傻是不是?別著急,這個思路有利於我們理清動態規劃究竟在做些什麼。)這時候我們發現用乙個標記來表示這句「湊夠0元我們最少需要0個硬幣」會比較方便,如果一直用純文本來表述,不出一會兒你就會覺得很繞了。那麼,我們用d(i)=j來表示湊夠i元最少需要j個硬幣。於是我們已經得到了d(0) = 0,表示湊夠0元最小需要0個硬幣。當i=1時,只有面值為1元的硬幣可用,因此我們拿起乙個面值為1的硬幣,接下來只需要湊夠0元即可,而這個是已經知道答案的,即d(0) = 0,所以,d(1) = d(1-1) + 1 = d(0) + 1 = 0 + 1 = 1。當i=2時,仍然只有面值為1的硬幣可用,於是我拿起乙個面值為1的硬幣,接下來我只需要再湊夠2-1=1元即可(記得要用最小的硬幣數量),而這個答案也已經知道了。所以d(2) = d(2 – 1) +1 = d(1) + 1 = 1+1=2。一直到這裡,你都可能會覺得,好無聊,感覺像做小學生的題目似的。因為我們一直都只能操作面值為1的硬幣!耐心點,讓我們看看i=3時的情況。當i=3時,我們能用的硬幣就有兩種了:1元的和3元的(5元的仍然沒用,因為你需要湊的數目是3元.5元太多了親)。既然能用的硬幣有兩種,我就有兩種方案。如果我拿了乙個1元的硬幣,我的目標就變為了: 湊夠3-1=元需要的最少硬幣數量。即d(3)=d(3-1)+1 =d(2)+1 =2+1=3。這個方案說的是,我拿3個1元的硬幣;第二種方案是我拿起乙個3元的硬幣,我的目標就變成: 湊夠3-3=0元需要的最少硬幣數量。即d(3) = d(3-3) + 1 = d(0) + 1 = 0 + 1 = 1,這個方案說的是,我拿1個3元的硬幣。好了,這兩種方案哪種更優呢?記得我們可是要用最少的硬幣數量來湊夠3元的。所以,選擇d(3)=1,怎麼來的呢?具體是這樣得到的:d(3) = min。
動態規劃
1. 動機:消除遞迴過程中產生的大量重疊子問題
2.多階段策略問題利用遞迴的思想, 把規模為n的問題轉化為規模為n-1的問題, 直到轉化為可以直接求解的原子問題. 一般情況下, 這樣的遞迴方法的時間複雜度是指數級別的, 但是如果所有不同的子問題的數目是多項式級別的, 那麼只需要多項式時間就可以解決這個問題, 這就是動態規劃的本質.
3.演算法四個步驟:(1)描述最優解結構(2)狀態轉移方程(3)bottom-up求解(4)構造最優解(最優分割,最優路徑)
在動態規劃演算法中,每步所作的選擇往往依賴於相關子問題的解。因而只有在解出相關子問題後,才能作出選擇。
通過乙個例項 Shell的快速入門教程
大四狗花了一天時間學習了shell 總結乙個例項來帶大家快速了解shell bin bash cd mkdir shell tut13 cd shell tut13 for i 0 i 10 i do touch test i.txt echo this is a test i test i.txt...
Flask入門教程例項 搭建乙個靜態部落格
現在流行的靜態部落格 生成工具有很多,比如 jekyll,pelican,middleman,hyde 等等,staticgen 列出了目前最流行的一些靜態 生成工具。我們的內部工具由 python flask mongodb 搭建,現在需要加上文件功能,寫作格式是 markdown,不想把文件放到...
動態規劃走樓梯 乙個題目幫你入門動態規劃演算法
如果有一座高度是10級台階的樓梯,從下往上走,每跨一步只能向上1級或者2級台階。要求用程式來求出一共有多少種走法。如果每次走1級台階,一共走10步,這是其中一種走法。我們可以簡寫成 1,1,1,1,1,1,1,1,1,1。如果每次走2級台階,一共走5步,這是另一種走法。我們可以簡寫成 2,2,2,2...