有n件物品和乙個容量為v的揹包。放入第i件物品耗費的空間是vi,得到的價值是wi。求解將哪些物品裝入揹包可以使得價值之和最大。
二維陣列的暴力解法,未涉及空間優化。
首先用子問題來定義狀態,f[i][j]表示前i個物品放到容量為j的空間總價值最大。f[i][j]這個狀態是由i-1推過來的,這裡有兩種考慮:第i中物品選擇還是不選擇,如果不選擇f[i][j]==f[i-1][j],如果選擇f[i][j] = max(f[i-1][j], f[i-1][j-v[i]]+w[i])。
max(f[i-1][j], f[i-1][j-v[i]]+w[i])的解釋:
第i件物品選擇,第i件物品佔據的空間是v[i],價值為w[i]。那麼前i-1件物品所佔據的空間為j-v[i],價值為f[i-1][j-v[i]]。而f[i][j]是f[i-1][j]和f[i-1][j-v[i]]+w[i]其中較大的乙個。
**部分:
#include
using
namespace std;
const
int maxn=
1010
;int v[maxn]
, w[maxn]
;int f[maxn]
[maxn]
;int n, m;
//分別表示物品總數為n 揹包容量為m
intmain()
}}int res =0;
for(
int i=
0; i<=m;
++i)
return0;
}
揹包問題 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...