考慮一般性的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 首先我們考慮貪心策略,選取最大價...