01揹包問題:
簡述:有n件物品,容量為v的揹包,每一件物品的容量為c[i] 價值為 w[i] 問如何裝物品 才能使在不超過揹包容量的前提下,價值最大。
計:dp[i][j]表示最大裝i個物品,此時揹包的記憶體為j時的價值大小,很顯然,j<=v;
dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i])
這個轉移方程的意思就是
如果第i個物品放入揹包中時,那麼前i-1個元素就要放入j-c[i]這個空間,如果第i個物品不放入揹包時,那麼i-1個元素就是要放入當前記憶體值j。
時間複雜度為o(nv) 空間複雜度也為o(nv)
//看了部落格說這個可以不需要memset 其實也沒事,o(n)的時間複雜度,但是一般題目memset還是要慎重使用的。
有時候也會卡空間複雜度,下面進行空間優化為o(v)
dp[j]=max(dp[j],dp[j-c[i]+w[i])
這個一維的轉移方程搭配的就是將二維陣列簡化為乙個雙重的for迴圈。這是01揹包的問題。
完全揹包問題
完全揹包與01揹包的差別就在於完全揹包是不限制個數的,我們所要討論的問題就是不在於是否取這個物品了,而是在於取幾件,0件,1件,2件,。。。。。
因此轉移方程可以轉變成
dp[i][j]=max(dp[i-1][j-kc[i]+kw[i])(0<=kc[i]<=v)
不需要考慮放或者不放,只需要考慮是否是否取。
將其優化的辦法:
1.空間上減為一維,也就是說
d[j]=max(d[j-c[i])+w[i],d[j])//有待討論
2.如果出現c[i]<=c[j],w[i]>=w[j]那麼這個可以j可以直接去掉。//但是在實際過程中,不太容易執行,也就不怎麼做考慮了。
寫到這裡,有兩個疑問
1.疑問點,為什麼01揹包要使用倒敘
2.完全揹包為什麼能轉換成不帶k的一維方程。
問題1:經過我一天的理解,我大致知道了為什麼需要逆序,
首先先來說一下,逆序和順序的區別
順序,每次從0更新到n,他更新的是什麼呢,是以i物品為媒介的所有值,
然後到了i->i+1的狀態時,他所更新的是i在i時刻的狀態,而不是i-1時刻的狀態,因此需要倒敘
舉個例子吧 容量為10
物品 價值 重量
1 5 3
2 4 2
3 2 4
當i等於1時開始第一層迴圈:
順序:dp[1]=max(dp[1],dp[1-3]+5)=0;
dp[2]=0
dp[3]=5
dp[4]=max(dp[4],dp[4-3]+5)=5
dp[5]=5
dp[6]=max(dp[6],dp[6-3]+5)=10
dp[7]=max(dp[7],dp[7-3]+5)=10
dp[8]=max(dp[8],dp[5]+5)=10
dp[9]=max(dp[9],dp[6]+5)=15
dp[10]=15
乍一看沒什麼問題
但是你看dp[6],dp[6]=10,但是只能放乙個物品不是嗎,沒有乙個物品價值為10,所以顯然順序是錯的。錯就錯在記錄的狀態不對。
那為什麼完全揹包就可以是正序的了呢。
首先來解釋完全揹包為什麼能優化成一維的反向01揹包。
首先正序的一維陣列可以實現一件事物的多選,就比如上面的dp[6]=10,這就意味著正序的01揹包可以實現多選,因此就符合01揹包的正序實現了。
//終於解決了啊啊啊啊啊啊啊啊啊啊啊啊啊哭了
現在來看多重揹包
多重揹包與完全揹包的區別就在於所有的東西不是隨意的,總共有n[i]個,所以其實可以跟完全揹包
dp[i][j]=max(dp[i-1][j-kc[i]]+k*w[i] k是有範圍的。
那麼如何把他的空間複雜度降下來呢,
一方面我們可以通過o(n^3)的迴圈,來進行。
但是可以進行二進位制優化,
這個二進位制優化的原理就是我們可以把一件物品拆分成2n,和n[i]-2n個這樣
深入理解樹形揹包
題目描述 p1273 有線電視網 某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊...
揹包九講 簡單揹包
揹包問題是一種動態規劃演算法的衍生問題。它可以被看作一種獨立的題型,也可以看作是一種線性動態規劃。學好揹包 學會揹包,對於深入理解動態規劃演算法有著極大的好處,並能幫助理解一些更深層次的動態規劃問題。那麼就開始吧 題目型別 有 n 件物品和乙個容量為 v 的揹包。第 i 件物品的費體積是 v i 價...
演算法 揹包九講
例題參考 資訊學奧賽一本通 初始化分兩種情況 1 如果揹包要求正好裝滿則初始化 f 0 0,f 1 v inf 2 如果不需要正好裝滿 f 0 v 0 有n件物品和乙個容量為v的揹包。第i件物品的費用 即體積,下同 是w i 價值是c i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,...