![完全背包深入理解問題_第1頁](http://file4.renrendoc.com/view/a07245d2a7c6577d5886500b9ef1b1be/a07245d2a7c6577d5886500b9ef1b1be1.gif)
![完全背包深入理解問題_第2頁](http://file4.renrendoc.com/view/a07245d2a7c6577d5886500b9ef1b1be/a07245d2a7c6577d5886500b9ef1b1be2.gif)
![完全背包深入理解問題_第3頁](http://file4.renrendoc.com/view/a07245d2a7c6577d5886500b9ef1b1be/a07245d2a7c6577d5886500b9ef1b1be3.gif)
![完全背包深入理解問題_第4頁](http://file4.renrendoc.com/view/a07245d2a7c6577d5886500b9ef1b1be/a07245d2a7c6577d5886500b9ef1b1be4.gif)
![完全背包深入理解問題_第5頁](http://file4.renrendoc.com/view/a07245d2a7c6577d5886500b9ef1b1be/a07245d2a7c6577d5886500b9ef1b1be5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
問題:給你一個可放總重量為W的背包和N個物品,對每個物品,有重量w和價值v兩個屬性,那么第i個物品的重量為w[i],價值為v[i]。現(xiàn)在讓你用這個背包裝物品,每代代123456輸入:W=5,N=w=[3,2,1],v=[5,2,解釋:當(dāng)i=2時,選取5次,總價值為5*3=150-10-1(每件物品只能拿一次),在完全背包問題中,每件物品可以拿任意如果從每件物品的角度來看,與之相關(guān)的決策已經(jīng)不再是選拿(1)或者不拿()012(W/w[i])件物品為止。我曾在上一課中對-1態(tài)規(guī)劃問題。那么為了起到對照的作用,我在這里再次給出分析步驟,不過比之前的稍微簡化一些。首先,題設(shè)中出現(xiàn)了“最多能裝的價值是多少”這樣的論斷。既然有“最”字,那么我們需要先考慮貪心算法,這里我直接給出一個反例:按照示例中的提示,雖然i=1價值最高,但最后得到的解不是真正的答案。即便重復(fù)選擇相同的物品)不會對當(dāng)前這個選擇產(chǎn)生副作用。因此,該問題無后效首先,我們先來確定動態(tài)規(guī)劃解法當(dāng)中的最初子問題,即初始化狀態(tài)。這跟0-1背包問題有些類似:由于物品的數(shù)量沒有限制,因此只有當(dāng)背包的容量為0時要終止執(zhí)行,但如果0。如果體現(xiàn)在代碼上,就是當(dāng)沒有物品時重量為0;而重量為0時顯然物品數(shù)量也為0。接著,我們來確定動態(tài)規(guī)劃問題中的狀態(tài)參數(shù),這與0-1背包問題幾乎一樣:NW因此,當(dāng)前背包內(nèi)的物品數(shù)量
W然后,我們再來看如何進(jìn)行決策。這里的區(qū)別,跟-1背包問題中的決策差別就比較大由于物品量是的此就面給示例,我以將種物品多次放入背包。因此,對于第tn種物品,我們有k種選擇(其中0≤k*w[tn]≤W):我們可以從001件、第2件……直到第(W/w[tn])件物品為止。然后在這么多子所以,我們可以看出,完全背包問題決策的在于,針對一種物品,它需要不同數(shù)量的情況下的最優(yōu)解。這顯然與-1背包問題的決策完全不同,總結(jié)來說就是:最后,動態(tài)規(guī)劃是需要一個備忘錄用二維數(shù)組來子問題的答案。跟之前一樣,為了通用起見,我將其命名為0-1DP(tn,rw)=
0,tn<=0,rw<=max{DP(tn?1,rw?k?w[tn])+k?v[tn]},(0≦kJava代代123456789intbag(int[]w,int[]v,intN,intW)int[][]dp=newfor(inti=0;i<N+1;i++){dp[i][0]=0;for(intj=0;j<W+1;j++){dp[0][j]=0;for(inttn=1;tn<N+1;tn++)for(intrw=1;rw<W+1;{dp[tn][rw]=dp[tn-//for(intk=0;k<=rw/w[tn];k++)dp[tn][rw]=Math.max(dp[tn][rw],dp[tn-1][rw-}}}return+}intsolveBag()intN=3,W=5;int[]w0,3,2,1};//int[]v0,5,2,3};//returnbag(w,v,N,W);}C++代代intDP(conststd::vector<int>&w,conststd::vector<int>&v,intN,intW)intdp[N+1][W+1];//memset(dp,0,4//for(inti=0;i<N+1;i++){dp[i][0]=0;for(intj=0;j<W+1;j++){dp[0][j]=0;8//for(inttn=1;tn<N+1;tn++)//for(intrw=1;rw<W+1;rw++)dp[tn][rw]=dp[tn-for(intk=0;k<=rw/w[tn];k++)dp[tn][rw]=max(dp[tn][rw],dp[tn-1][rw-k*w[tn]]+ return21intDPSol()intN=3,W=5;//std::vector<int>w={0,3,2,1};//std::vector<int>v={0,5,2,3};// returnDP(w,v,NW);//29kv,那么最后的時間復(fù)雜度就是O(kv2)。我們?nèi)绻仡櫼幌?-1背包問題,就會發(fā)現(xiàn)0-1背包的時間復(fù)雜度是O(kv0-1現(xiàn)在,按照題設(shè)和上面的狀態(tài)轉(zhuǎn)移方程的定義,我們來思考一下:假如要拿第tn個物品,當(dāng)前物品重量為w[tn],我們會放入第0件、第1件、第2件……k件該物品時的價因此,要求剩余容量為rw(rw-0*w[tn)時的最優(yōu)解,就需要遍歷求出rw-0*-次求解rw-2*w[tn]。所以,在完全背包問題中,依然存在重復(fù)計算。單,我們只需要把問題轉(zhuǎn)換成一種新的0-1背包問題就行了。0-1tntn個物品狀態(tài)下的最優(yōu)解,是第tn?1個物品的最優(yōu)解(子問題)?當(dāng)前的決策推導(dǎo)出來的。0-1rwtn件物品的時候,我們只需要考慮拿或不拿第tn件物品,而不需要考慮放入幾個第tn件物品。根據(jù)上述思路,在解決完全背包問題時,我們可以把之前的子問題等價地轉(zhuǎn)化成一個新的子問題來解決,以消除上面提到的重復(fù)計算(多出來的那個子循環(huán))。另rw確定時,在處理第tntnrwmax(狀態(tài)A,狀態(tài)B)因此,每一次我們只需考慮,當(dāng)前是否要把第tn個物品放入背包就行了。至于之前有沒有放過第tn件物品,以及放了幾件進(jìn)入背包,已經(jīng)在容量更小的時候計算過了(需要注意的如果你還是覺得有點(diǎn)暈,沒關(guān)系,我們一種說法。在-1品只能放入一次,所以我們是以上一個物品的最優(yōu)解為基礎(chǔ)進(jìn)行決策推導(dǎo)的。而在完全背包問題里,因?yàn)橐粋€物品可以放入0到多次所以 須以當(dāng)前物品tn在容量更小時,計算出的最優(yōu)解為基礎(chǔ)進(jìn)行決策推導(dǎo)。tnrw更小的時候,就已經(jīng)選擇過0到多次當(dāng)前物品了,而且得到的最優(yōu)解在緩存中,這部分不需要每次都重復(fù)求DP(tn,rw)=
0,tn<=0,rw<=Java代代12345intbag(int[]w,int[]v,intN,intW)//int[][]dp=new//66789for(inti=0;i<N+1;i++){dp[i][0]=0;for(intj=0;j<W+1;j++){dp[0][j]=0;for(inttn=1;tn<N+1;tn++)for(intrw=1;rw<W+1;{dp[tn][rw]=dp[tn-//如果可以放入,則嘗試放入第tnif(w[tn]<=rw)dp[tn][rw]=Math.max(dp[tn][rw],dp[tn][rw-w[tn]]+}}}return}intsolveBag()intN=3,W=5intw0,3,2,1//intv0,5,2,3//returnbag(w,v,N,W);}代C++代1intDP(conststd::vector<int>&w,conststd::vector<int>&v,2intdp[N+1][W+13memset(dp,0,45//6for(inti=0;i<N+1;i++){dp[i][0]=0;7for(intj=0;j<W+1;j++){dp[0][j]=0;89//for(inttn=1;tn<N+1;tn++)//for(intrw=1;rw<W+1;{dp[tn][rw]=dp[tn-//如果可以放入,則嘗試放入第tnif(w[tn]<=rw)dp[tn][rw]=max(dp[tn][rw],dp[tn][rw-w[tn]]+}}}return}intDPSol()intN=3,W=5std::vector<int>w={0,3,2,1};//std::vector<int>v={0,5,2,3};//returnDP(w,v,N,W);}5不知道你發(fā)現(xiàn)了沒有,在改進(jìn)后的代碼中沒有k參與計算了,那么這個由0到k的循環(huán)過 子問題。在計算DP(3,5)時k=5,因此循環(huán)從6個值中求解最優(yōu)解(即求出最大值)。但是我們可以看到其中的前五步,在DP(3,4)這個問題中,也會被計算到,此時k=4。因此,DP(3,4)和DP(3,5)之間只相DP(3,5)和DP(3,3)(狀態(tài))kDP(tn,rw)=
0,tn<=0,rw<=DP(tnrw),那么我們只依賴于DP(tn?1rw)和DP(tn0)。tn1tn相同時的結(jié)果。10行做tn?1的緩存,用第1行做tn21行做tn?1的緩存,用第0行做tn在計算第3個物品時,用第0行做tn?1的緩存,而用第1行做tn的緩存……以此Java代代12345intbag(int[]w,int[]v,intN,intW)//int[][]dp=new//for(intrw=1;rw<W+1;rw++)tn2代表當(dāng)前行的緩存索引intctn=tn%2;1ctn代表上一行的緩存索引intptn=1-ctn;dp[ctn][rw]=//如果可以放入則嘗試放入第tnif(w[tn]<=rw)dp[ctn][rw]=Math.max(dp[ctn][rw],dp[ctn][rw-w[tn]]+}}}returndp[N%}intsolveBag()intN=3,W=5;int[]w0,3,2,1};//int[]v0,5,2,3};//returnbag(w,v,N,W);}6for(inti=0;i2;i++){dp[i][0]=0;7for(intj=0;jW+1;j++){dp[0][j]=0;89for(inttn=1;<N+1;tn++)C++代代123456789intDP(conststd::vector<int>&w,conststd::vector<int>&v,intN,intintdp[2][W+1memset(dp,0,//for(inti=0;i<2;i++){dp[i][0]=0;for(intj=0;j<W+1;j++){dp[0][j]=0;//for(inttn=1;tn<N+1;tn++)//for(intrw=1;rw<W+1;rw++)tn2代表當(dāng)前行的緩存索引intctn=tn%2;tn1代表上一行的緩存索引intptn=tn%1;dp[ctn][rw]=//如果可以放入則嘗試放入第tnif(w[tn]<=rw)dp[ctn][rw]=max(dp[ctn][rw],dp[ctn][rw-w[tn]]+}}}returndp[N%}intDPSol()intN=3,W=5std::vector<int>w={0,3,2,1};//std::vector<int>v={0,5,2,3};//returnDP(w,v,N,W);}緩存定義成只有2行,哪一行是上一行,交替使用兩部分緩存。通過這個巧妙的方式,我們大幅減少了緩存空間的使用,尤其在物品數(shù)量很多的時候效果會非常好。amasterpiec~雖然完全背包問題已經(jīng)在之前的-1有結(jié)束。我會在后續(xù)的課程中,結(jié)合完全背包的衍生面試問題與你進(jìn)行探討。不過,你還是要把本節(jié)課中提到的技巧和方法多加練下,就目前來說這更為重要。0-1如果你已經(jīng)理解到這個層面,那么恭喜你,面試這一關(guān)你已經(jīng)達(dá)標(biāo)了,面試官應(yīng)該會很滿意。因?yàn)楦鶕?jù)我的經(jīng)驗(yàn),真就是有很多面試者會栽在這一類動歸問題的復(fù)雜度上,更別提寫出代碼了。優(yōu)化算法的時間復(fù)雜度:動態(tài)規(guī)劃的子問題并不一定是唯一的,不同的子題可能會帶來不同的計算消耗。因此,我們要盡量將問題轉(zhuǎn)換成時間復(fù)雜度最低的子優(yōu)化算法的空間復(fù)雜度:動態(tài)規(guī)劃的在于狀態(tài)(即備忘錄),定帶來消耗,也就是以空間換時間。但是在實(shí)際應(yīng)用中,實(shí)際的條件并不一定能足動態(tài)規(guī)劃的標(biāo)準(zhǔn)狀態(tài)方式。此時,我們要考慮如何壓縮狀態(tài)數(shù),降低空間雜我們已經(jīng)學(xué)習(xí)了量是無限的?,F(xiàn)在,給你這樣一個問題,如果每種物品不像0-1背包問題中那樣只有一個,也不像完全背包問題中那樣,即每種物品有個數(shù)的限制(≥1)。那么在這種題 售賣。頁面已增加防盜追蹤,將依 上一 06|0-1背包:動態(tài)規(guī)劃 o下一 01背包是跟前n-1個物品比較,1Paul]的最優(yōu)解的時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑材料進(jìn)口物流合同樣本
- 礦產(chǎn)開采用地中介服務(wù)合同
- 二零二五年度包裝機(jī)械遠(yuǎn)程監(jiān)控與維修服務(wù)合同
- 家禽養(yǎng)殖合同禽類采購合同
- 房屋買賣合同詳情
- 農(nóng)業(yè)工程綜合實(shí)施方案
- 軟件技術(shù)服務(wù)合同書
- 國際酒店服務(wù)管理手冊
- 工程監(jiān)理規(guī)范實(shí)務(wù)手冊
- 牛羊肉供貨協(xié)議書
- 2025年中國東方電氣集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 充電樁知識培訓(xùn)課件
- 模具檢測知識培訓(xùn)
- 2025年七年級下冊道德與法治主要知識點(diǎn)
- 第25章 概率初步(2)-2024-2025學(xué)年數(shù)學(xué)人教版九年級上冊(含答案解析)
- 2025年交通運(yùn)輸部長江口航道管理局招聘4人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(2024版)解讀
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測試(零模)英語 含解析
- 偏癱足內(nèi)翻的治療
- 蘭溪市排水防澇提升雨污管網(wǎng)修復(fù)改造初步設(shè)計文本
- 2024-2030年中國永磁電機(jī)市場現(xiàn)狀分析及前景趨勢預(yù)測報告
評論
0/150
提交評論