01揹包問題

2021-06-26 20:06:23 字數 1212 閱讀 4580

01揹包問題: 題目

有n件物品和乙個容量為v的揹包。第i件物品的占用容量是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

思路:

揹包問題,最終結果是要求將n個物品待選物品放入容量為v的揹包能獲得的最大值。

假設將乙個物品放入容量為v的函式記為f1(v),那麼動態規劃的情況下:可以先求將1個待選物品放入容量為(0……v)的揹包中獲得的價值最大值,用函式表示就是求出f1(0)……f1(v),再求將2個待選物品放入容量為(0……v)揹包中獲得價值的最大值f2(0)……f2(v)。…………最終求出將v個待選物品放入容量為(0……v)的揹包中獲得價值的最大值fv(0)……fv(v)。然後最後那個fv(v)就是將v個待選物品放入容量為v的揹包中獲得價值的最大值。

中心思想就是,當新納入乙個待選物品i時,這個待選物品有兩種情況,放入或者不放入,

1.放入,則它的現在的情況就是:將這第i個物品放入容量為x(0……v)的揹包中獲得的價值,也就等同於將i-1個物品放入容量為x-c(i)的揹包中獲得的價值。

2.不放入,則它的現在的情況就是:將這前i-1個物品放入容量為x(0……v)的揹包中獲得的價值,

兩種情況取其最大值,就是將前i個待選物品放入容量為x(0……v)的揹包中獲得的價值的最大值。表示式如下:

fi(v)=max

以上方法的時間和空間複雜度均為o(vn),其中時間複雜度應該已經不能再優化了,但空間複雜度卻可以優化到o(n)。理由如下

可見,每次求新納入乙個待選物品時,總要根據上一次i-1的結果來求這一次的。所以,可以維持乙個主迴圈i,用來求當納入i個物品時,容量為x(0……v)的揹包中獲得價值最大值。

for i=1…n for v=v

…0  f(v)=max

而且更新f[v]陣列時要小心,因為這一層的(i層)f[v]用到的是上一層(i-1層)的f[v-c[i]],所以要倒著更新f陣列。

初始條件:初始條件為放入0個物品時容量為x(0……v)的揹包獲得的最大價值,肯定為0啦。求每層的max時候,如果f(v-c[i])為負數,證明這個物品在當前容量下放不下,只能用上次迴圈的f(v)來更新這次的,即實際意義上的不放入這個物品了。**如下:

#include using namespace std;

int main(void)

int *maxvalueofx=new int [m+1];

for (int i=0;i=1;j--)

else

}} cout<

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

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...