用自己的話解讀一下這個問題。
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...