回顧基本01揹包問題

2021-06-22 12:47:39 字數 1200 閱讀 9734

今天練了一下當年的揹包問題,發現居然oj還沒過,趕緊刷一下。想到當年,每次做揹包,就和軍爺一起回憶

eason的你的揹包,從此變得好浪漫~~~~~

題目太經典了,分析就略過了。寫個遞推方程:

c[i,j]=max if bagweight>=j>=w[i]

=c[i,j-1]  if  j bagweight)

遞推出口尚且如此,自然遞推通項式也是如此,所以一開始看到教材裡第二層loop 是需要用個min函式其實是殊途同歸的。

所以大家根據這裡的分析是需要改遞推方程的,要擴充成兩種情況,小生此處就不擴了,一切盡在**裡,而且書上也沒擴~~~

另外還有就是此題還要知道解的路徑,思路是根據c[n][bagweight] 遞推回去,看等於哪個,就賦值為選或者不選該項。

此題有個刮三地方就是需要返回所有解中對應的二進位制數最小的,我大概當時恰在這裡了,現在想想其實就是

if c[i][j]=c[i-1][j] || c[i-1][j-w[i]+v[i]], select latter, as it will lead right more 1, and left more 0, which lead small binary number

等於的話優先走1的那條回溯路徑,就對了這樣前面就0了,是解中二進位制數最小的。

附上**:

#include using namespace std;

int zeroonebag(int**c, bool* select, int* value, int* weight, int n, int bagweight)

else if(c[i][bagweighttmp]==c[i-1][bagweighttmp])

select[i]=false;

else

;} else

i--;

}if(bagweighttmp>=weight[1])

select[1]=true;

else

select[1]=false;

return c[n][bagweight];

}int main()

return 0;

}

恩 還碰到了乙個申請c的問題,居然申請了n*n得陣列,於是申請的堆出了乙個奇怪的bug,果然從coding開始每一句都要知道自己再幹啥,記得之前好像在**看到過這句話。。。。而且一定要集中,我好像在這步開了小菜

01揹包的回顧

01揹包 n 件物品,如何選擇才能在揹包容量為 v 的情況下做出最好的?設物品序號為從 1 到 n,體積和價值分別為 c i v i 則可畫出決策樹 寫出狀態方程 f v,n max 如此,則可輕易用遞迴寫出 o 2 n 的 在此不寫了。但如何優化呢?考慮到,遞迴時不論如何呼叫,引數總在 v n 的...

揹包問題 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 ...