記錄路徑的01揹包問題

2021-07-27 09:34:15 字數 1264 閱讀 1897

在01揹包問題中,求出最優解並記錄揹包內物品,動態規劃的方法求其問題,最核心的公式為f[i][j]=max

在考慮當前第i個物品是否放入的時候就是比較

前面的i-1個物品放在容量為j的揹包中時揹包中總價值與

前面的i-1個物品放在容量為j-weight[i]的揹包中並加上當前第i個的價值value[i]的總價值

比較完後選擇當前i個物品放在j容量的包中的最佳方案。

同時在記錄其路徑的時候,路徑為conf[i][j]=01,若當前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的情況的最大價值...