此題在華為筆試中出現次數很多。
輸入:價值:6,3,5,4,6
重量:2,2,6,5,4
揹包容量:10
輸出:偷到的總價值:15
#include #include #include using namespace std;
int main()
; int weight[6] = ;
int cap;
//帶逗號的迴圈資料輸入
for (int i = 1; i < 6; ++i)
for (int i = 1; i < 6; ++i)
cin >> cap;
//填表過程
int f[6][100] = ;
for (int i = 1; i < 6; ++i)
else
}} cout << f[5][10];
system("pause");
}
填表過程參考
主要公式如下:
0-1揹包問題是指每一種物品都只有一件,可以選擇放或者不放。現在假設有n件物品,揹包承重為m。
對於這種問題,我們可以採用乙個二維陣列去解決:f[i][j],其中i代表加入揹包的是前i件物品,j表示揹包的承重,f[i][j]表示當前狀態下能放進揹包裡面的物品的最大總價值。那麼,f[n][m]就是我們的最終結果了。
採用動態規劃,必須要知道初始狀態和狀態轉移方程。初始狀態很容易就能知道,那麼狀態轉移方程如何求呢?對於一件物品,我們有放進或者不放進揹包兩種選擇:
(1)假如我們放進揹包,f[i][j] = f[i - 1][j - weight[i]] + value[i],這裡的f[i - 1][j - weight[i]] + value[i]應該這麼理解:在沒放這件物品之前的狀態值加上要放進去這件物品的價值。而對於f[i - 1][j - weight[i]]這部分,i - 1很容易理解,關鍵是 j - weight[i]這裡,我們要明白:要把這件物品放進揹包,就得在揹包裡面預留這一部分空間。
(2)假如我們不放進揹包,f[i][j] = f[i - 1][j],這個很容易理解。
因此,我們的狀態轉移方程就是:f[i][j] = max(f[i][j] = f[i - 1][j] , f[i - 1][j - weight[i]] + value[i])
當然,還有一種特殊的情況,就是揹包放不下當前這一件物品,這種情況下f[i][j] = f[i - 1][j]。
揹包問題 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...