演算法提高 動態規劃 0 1揹包問題

2021-09-19 14:43:08 字數 1958 閱讀 6707

考慮一般性的0-1揹包問題,設揹包容量為c,物品數量為n,每件的物品都有自己的重量和價值,每件物品只有兩種狀態:放入(記為1)、不放入(記為0),試尋找最優解滿足放入的物品總重量不超過揹包容量的前提下,放入的物品總價值最大。

記揹包為{},候選物品欄為()。

我們依次決定a,b,c,d,e是否要放入。

先看a要不要放入。

如果對於{}(a,b,c,d,e),無非轉化成兩種方案:

方案1:放入a,得到(b,c,d,e),揹包剩餘容量減少,則接下來考慮b

方案2:不放入a(即丟棄a),得到{}(b,c,d,e)揹包剩餘容量不變,則接下來考慮b

a要不要放入,最終就取決於兩個方案誰更好。

然後看b要不要放入。在剛才的兩個方案的基礎上,每個方案又轉化成放入b和不放入b的問題。

如果剛才選的是方案1,那麼:

方案1-1:放入b,得到(c,d,e),揹包剩餘容量減少,則接下來考慮c

方案1-2:不放入b,得到(c,d,e),揹包剩餘容量不變,則接下來考慮c

如果剛才選的是方案2,那麼:

方案2-1:放入b,得到(c,d,e),揹包剩餘容量減少,則接下來考慮c

方案2-2:不放入b,得到{}(c,d,e),揹包剩餘容量不變,則接下來考慮c

以此類推直到e考慮完畢,將會有

下面以具體程式設計實現為例:假設揹包總容量為c=100,候選物品有n=20件,每件物品重量w[i]取值區間為[1,100], 每件物品價值v[i]取值區間[1,100]

#include #include using namepsace std;

int main() ;

for (int i = 0; i < n; i++)

//隨機生成n件物品的重量

int w[n] = {};

for (int i = 0; i < n; i++)

return 0;

}

假設用函式backpack(i, j) 表示決定剩餘容量為j時是否要放入i號物品的問題的最優解之總價值。

backpack(i, j) = max(backpack(i+1, j-w[i]) + v[i], backpack(i+1, j));

完整**:

//有n個物品,揹包容量為c

#include #include //生成隨機數rand()所需要的標頭檔案

using namespace std;

void printlist(int a, int l)

cout << endl;

} void knapsack(int n, int w, int v, int m[101], int c)else

}}elseelse

}} }

}void traceback(int n, int w, int v, int m[101], int c, int x) else

} }int main() ;

for (int i = 0; i < n; i++)

cout << "物品價值如下:" << endl;

printlist(v, n);

int w[n] = {};

for (int i = 0; i < n; i++)

cout << "物品重量如下:" << endl;

printlist(w, n);

int m[n][101] = {}; //**

int x[n] = {}; //物品是否放入的真值表

knapsack(n, w, v, m, c);

traceback(n, w, v, m, c, x);

cout << "物品是否放入的真值表如下:" << endl;

printlist(x, n);

return 0;

}

最詳細動態規劃解析——揹包問題 - oscarwin - csdn部落格

演算法 動態規劃0 1揹包問題

有乙個容量為 n 的揹包,要用這個揹包裝下物品的價值最大,這些物品有兩個屬性 體積 w 和價值 v。定義乙個二維陣列 dp 儲存最大價值,其中 dp i j 表示前 i 件物品體積不超過 j 的情況下能達到的最大價值。設第 i 件物品體積為 w,價值為 v,根據第 i 件物品是否新增到揹包中,可以分...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...