01揹包問題分析

2021-07-05 01:44:01 字數 1284 閱讀 2647

「揹包題目」的基本描述是:有乙個揹包,能盛放的物品總重量為s,設有n件物品,其重量分別為w1,w2,…,wn,希望從n件物品中選擇若干物品,所選物品的重量之和恰能放進該揹包,即所選物品的重量之和即是s。遞迴和非遞迴解法都能求得「揹包題目」的一組解,試寫出「揹包題目」的非遞迴解法。

解法一:

最初思路就是動態規劃,

動態規劃求一組解,我們用f[i][j]用來表示前i件物品隨意選擇一些物品能夠恰好裝滿容量為j的揹包的可行性=1,不可行則為0,其中i指的是物品標號,j指的是揹包的大小(0~s);如果j < v[i]:f[i][j] = f[i-1][j] ,表示第i個物品的重量已經超過最大重量j了,則結果變為了前i-1件物品能否恰好裝入容量為j的揹包的可行性即等於f[i-1][j];

如果j>=v[i],此時就可以選擇裝或者不裝第i件物品了,如果裝入,則它的可行性就變為了前i-1前物品是否能恰好裝入j-vec[i]容量的揹包中可行性了;選擇不裝,則它的可行性變為了前i-1物品能否恰好裝入容量為j的揹包中可行性了,兩者有乙個可行,表明前i件物品就能恰好裝入容量為j的揹包中。f[i][j] = f[i-1][j]||f[i-1][j-vec[i]]

初始化:f[i][0]=1(i=0,1,2,,..n) 其它的f[i][j]都等於0

找出最終的一組解,用回溯就可以了。如果存在可行解,那麼f[n][s]一定為1

主要公式為:

**為:

#include#includeusing namespace std;

vectorpackageinteration(int weight, int s,int n);

void main()

; int s=20;

vectorres;

res=packageinteration(weight,s,n); }

vectorpackageinteration(int weight, int s,int n)

} int j=s;

vectorres;

for(int i=n;i>0;i--)

}} return res;

}

這種動態規劃的詳細分析在部落格中有提及,區別是f[i][j]值由總價值變為可行性。

另外值得注意的是:

動態規劃的前提是我們的物體重量陣列是排序的(由小到大),如果是隨機的,我們**發現會有問題!!!!這用動態規劃關鍵方程也可解釋,j是由小到大的,我們的總重量是增量增加的。

01揹包 完全揹包 多重揹包問題分析

揹包問題可以用遞迴方法和動態規劃方法,遞迴 簡潔,方便理解,不過由於重複計算,效率較低,dp方法將前面的計算結果儲存到二維陣列中,效率較高,值得推薦。1.01揹包 zeroonepack 有n件物品和乙個容量為m的揹包。每種物品均只有一件 第i件物品的費用是weight i 價值是value i 求...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...