連續揹包問題:
還是先講一段故事吧。假如你是乙個賊,有一天你去地主家偷東西。有4斤金沙,2斤銀沙,10斤銅沙。
但是運氣不好的是,你的包只能裝8斤東西。那麼你該偷什麼走呢?
我們這邊把這個問題分解成 方程式和約束條件
方程式:gx + sy + cz --->max #gsc分布代表金銀銅
約束條件:x+y+z = 8
g>s>z
max(g)=4 max(s)=4 max(c)=4
這裡這個問題,是貪心演算法的主場,當然有很多解決問題的方法,我們的目的就是找到最優秀的解,我們先保證裝足夠多的金子,然後如果金子裝完了,
而且還有剩餘空間的話,就裝足夠多的銀子。。。。在連續問題裡,貪心演算法的確可以得到最優解,貪心演算法的核心就是就是保證區域性的優越性,、
但是保證區域性的優越性,並不能保證整體的優越性。我們這邊先不深入說貪心演算法。我們接著說揹包問題。
0/1揹包問題:
有乙個包和n個物品,包的容量為m,每個物品都有各自的體積和價值,問當從這n個物品中選擇多個物品放在包裡而物品體積總數不超過包的容量m時,能夠得到的最大價值是多少?[對於每個物品不可以取多次,最多只能取一次,之所以叫做01揹包,0表示不取,1表示取]
這裡我們當然可以用貪心演算法,和窮舉演算法,
但是它們都有乙個致命的缺點 貪心演算法:往往得不到最優解 窮舉花費的時間又太多了
這裡就需要乙個新的演算法了---》動態規劃(dynamic programming)--->本質上它是對窮舉演算法的優化
動態規則:首先不要通過他的名字去理解它,它只是乙個名字而已,呵呵
好累呀、、、、要不要先休息一會。
我們先談論子結構的問題吧
def fib(n):我們先看這段**,如果我傳了fib(5). 他會遞迴 n-1 n-2 然後接著。global numcails
numcails +=1
print "numcails-->",numcails
print "n---->",n
if n <=1:
return n
else:
return fib(n-1) + fib(n-2)
這段**的問題就是,他有很多重複的子結構
這個是fib(5)的輸出,你可以看到他有很多相同的子結構
numcails--> 1n----> 5numcails--> 2n----> 4numcails--> 3n----> 3numcails--> 4n----> 2numcails--> 5n----> 1numcails--> 6n---->0那麼dp是如何解決的呢?numcails--> 7n----> 1numcails--> 8n----> 2numcails--> 9n----> 1numcails--> 10n---->0
numcails--> 11n----> 3numcails--> 12n----> 2numcails--> 13n----> 1numcails--> 14n---->0
numcails--> 15n----> 1
我們先看下圖 我們要從a-f
一共有多少中方案呢?
這個是乙個很簡單的問題 但是不知道你有沒有關注到d 這個重合節點的。
而dp的核心就是尋找最優子結構,說白了就是沒有重合的子結構。
揹包問題(一) 0 1揹包問題
揹包問題有多種,比如 問題1 物品受限揹包,第i種物品最多取ni個 問題2 0 1揹包,本文即將介紹,xi 0或者1,i 1 2 3.n 問題3 多揹包問題,m個揹包,揹包j裝入最大重量bj,j 1 2 3.m,在滿足所有揹包重量約束 條件下使得裝入物品價值最大 問題4 二維揹包,每件物品有wi和體...
揹包問題 01揹包
有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...
揹包問題(01揹包)
1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...