01揹包問題

2021-07-28 19:59:16 字數 1583 閱讀 3705

用自己的話解讀一下這個問題。

01揹包問題就是在有限的空間裡面得到最大價值

有動態方程f[i,j] = max

意思是,當要放入第i個物品時,最大價值取決於2個方案的選擇

1、加入第i個物品,f[i,j]  等於 加入i之前的最大值 f[i-1,j-wi] ,加上i的價值pi(wi為i的重量)

2、不加入第i個物品,f[i,j] 等於 不加入i之前的最大值f[i-1,j]

結果取1、2中最大值。

這是乙個遞迴問題。

題目:有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

name

weight

valuea2

6b23

c65d

54e4

6 取陣列goods_w[5] =    goods_v =

當i  = 0時,可以選擇a,b,c,d,e,當i= 1時,可以選擇b,c,d,e,當i= 4時,只能選擇e

當i = 4時,揹包重量從1到10,結果為

name

weight

value12

3456

78910

e460

0066

6666

6 當bagsize 小於4時,放不了e,最大值為0 ,大於4時,因只有e乙個物品可以選擇,為0

當i = 3 時,可以有e,d兩個物品選擇。bagsize小於4,放不了東西,最大值為0,當bagsize=5時,

有d,e兩個物品可以2選1。呼叫動態方程f (3,5)=

1、放入d,f(i-1,j-wi)+pi = f (4,5-5) + 4 , f(4,0) = 0, 則放入d的最大值為4

2、不放入d,f(i-1,j) = f(4,5) = 6 

方案2>方案1

同理可以得到

name

weight

value12

3456

78910

a260

6699

1212

151515b

2303

3669

991011c6

5000

6666

61011d

5400

0666

661010e4

6000

6666

666 c **如下,寫的比較簡陋。

#include int get_value(int i,int bagsize);

int goods_w[5] = ;

int goods_v[5] = ;

int get_value(int i, int bagsize)

int a = get_value(i+1,bagsize);

int b = 0;

if (bagsize >= goods_w[i])

return a>b?a:b;

} int main()

}return 0;

}

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