在01揹包問題中,求出最優解並記錄揹包內物品,動態規劃的方法求其問題,最核心的公式為f[i][j]=max,
在考慮當前第i個物品是否放入的時候就是比較
前面的i-1個物品放在容量為j的揹包中時揹包中總價值與
前面的i-1個物品放在容量為j-weight[i]的揹包中並加上當前第i個的價值value[i]的總價值
比較完後選擇當前i個物品放在j容量的包中的最佳方案。
同時在記錄其路徑的時候,路徑為conf[i][j]=0或1,若當前f[i][j]為放入第i件物品,則為1,最終形成乙個i行j列的矩陣
f形成的矩陣中第n行j列即為前n件物品放在j容量的包中最大價值解。
其路徑便從第n行開始輸出,路徑conf形成的矩陣第n行j列即為第n件物品在包容量為j時是否放入,若n行j列為0,則代表第n件物品未放入j容量的包中,則再看第n-1件物品,若n-1件物品放入了包中即當前位置為1,則需要在包容量j上減去此時的weight[i],如此反覆直到物品全部檢索完或者容量小於0。
#include
using
namespace
std;
#define n 7
#define v 10
int main();//重量
int value[n+1] = ;//價值
int big[n+1][v+1] = ;//前n件物品容量為v的包
int conf[n+1][v+1] = ;//記錄路徑
for(int i=1;i<=n;i++)else}}
for(int i = n; i >= 1; i--)
cout
<< endl;
}
for(int i = n; i >= 1; i--)
cout
<< endl;
}
for(int i = n,j=v; i>0&&j>0; i--)
}return
0;}
0 1揹包 記錄路徑 UVA624
題目大意 有乙個固定長度的磁帶,想要把cd放進去,空間利用率盡可能的高,每個磁帶只能用一次。01揹包問題,就是把體積和重量看做了tracks和time,這裡注意列印路徑的方法 include include include include include include include includ...
01揹包記錄路徑 東東開車了
多組輸入 每行輸入第乙個數字n,代表總時間,第二個數字 m 代表有 m 張唱片,後面緊跟 m 個數字,代表每張唱片的時長 例如樣例一 n 5,m 3,第一張唱片為 1 分鐘,第二張唱片 3 分鐘,第三張 4 分鐘 所有資料均滿足以下條件 n 10000 m 20 輸出所有唱片的時長和總時長,具體輸出...
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...