揹包問題(01揹包)
以下內容為學習過程的總結,可能有些copy網上內容,請不要在意這些細節!!
01問題的提出:有n件物品和乙個容量為v的的揹包,n件物品的費用為c[i](i=1--n);
價值為w[i],問將那些物品放入揹包使得價值最大且不超過容量?
思路:01揹包的特點是每種物品只有一件,可以選擇放或不放,可以用子問題來定義狀態,即
f[ i ][ v ]表示第i件物品放入容量為v的揹包中可獲得最大的價值,則其狀態方程可以表示為
f[ i ][ v ]=max(f[i-1], f[i-1][v-c[i]+w[i]);
這個方程就是01揹包的全部內容,將前i件物品放入容量為v的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。
優化方法:
上面的方程式是用二維陣列,想想是否可以用一維陣列解決問題,所以就有了優化方法
**如下:
for i=1..n對於上面的優化方法是這樣的,思路是要求出f[i][v]需要用到肯定是有乙個主迴圈i=1..n,每次算出來二維陣列f[i][0..v]的所有值。那麼,如果只用乙個陣列f[0..v],能不能保證第i次迴圈結束後f[v]中表示的就是我們定義的狀態f[i][v]呢?for v=v..0
f[v]=max;
f[i][v]是由f[i-1][v]和f[i-1][v-c[i]]兩個子問題遞推而來,能否保證在推f[i][v]時
(也即在第i次主迴圈中推f[v]時)能夠得到f[i-1][v]和f[i-1][v-c[i]]的值呢?
事實上,這要求在每次主迴圈中我們以v=v..0的順序推f[v],這樣才能保證推f[v]時f[v-c[i]]儲存的是狀態f[i-1][v-c[i]]的值。
初始化細節:
對於01揹包的問題一般有兩種問題,
一是問將揹包裝滿時的最優解;
二是揹包不裝滿時的最優解;
對於以上兩種的陣列初始化是不一樣的,第一組要求揹包恰好裝滿著初始化要求f[0]=0;
f[1--n]=-∞ ;
對於第二種這要求全部初始化為0;
初始化的f陣列事實上就是在沒有任何物品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量為0的揹包可能被價值為0的nothing「恰好裝滿」,其它容量的揹包均沒有合法的解,屬於未定義的狀態,它們的值就都應該是-∞了。如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,這個解的價值為0,所以初始時狀態的值也就全部為0了。
補充內容:
01揹包是最為基本的揹包型別,所以對01揹包的變形會有很多種,所以就需要你深刻理解01揹包的思想和實現步驟,這幾天做題發現了乙個變形,以後看到背的變形還會補充;
該題是hdu2955
這題是一道典型的01揹包,但所不同的是需要你用01揹包的思想轉化問題,題意是乙個劫匪想去搶銀行,給你乙個被抓的概率和幾個銀行和在這個銀行被抓的概率,一看題這不是把概率當揹包,套公式就完了,可是你想過概率怎麼加嗎?
所以這題做法不是將概率作為揹包,而是搶的錢作為揹包,計算出所有的錢的集合,然後遞減求的搶這些錢的概率,然後與你被抓的概率做比較,輸出大於該概率的係數,也就是你能搶的錢數,這個變形很有意思,當然會對你對01揹包理解更加深刻,做做吧!
**這裡就不給出了,網上別人的部落格有,不會可以看看!
中級篇 揹包問題1(01揹包)
n件物品,沒見有重量wi,價值vi 選其中幾件放入容量為m的揹包中,求價值的最值。經典揹包問題 揹包問題分三類 1.01揹包 每件物品僅一件,可以不將揹包裝滿 要麼取0件要麼1件 2.完全揹包 每件物品無限件,可以不將揹包裝滿。3.多重揹包 每件物品可一定數量件,可不將揹包裝滿。此片詳解01揹包。建...
動態規劃(1) 01揹包問題
題目 現有n個物品,重量依次為w i 使用int weight表示 價值依次為 v i 使用 int values表示 現有乙個可裝重量為17的包 使用bag表示 求使揹包物品價值最大化的最優解,示例 全排列問題 深度搜尋字典序 author swing public class main 物品的價...
揹包問題 01揹包 完全揹包 多重揹包
01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...