0 1揹包問題

2022-09-21 04:24:09 字數 1182 閱讀 5318

目錄已知乙個揹包最多能容納體積之和為v的物品。現有 n 個物品,第 i 個物品的體積為 vi , 重量為 wi。求當前揹包最多能裝多大重量的物品?

資料範圍: 1≤v≤1000,1≤n≤1000,1≤n≤1000 , 1≤vi≤1000, 1≤wi≤1000

高階:o(n⋅v)

每個物品只有2種狀態:放入(0),不放入(1),也因此稱為01揹包問題。

假設第i個階段表示處理第i個物品,第i-1個階段表示處理第i-1個物品,則當處理第i個物品時,前i-1個物品已處理完畢,只需要考慮第i-1階段向第i階段的轉移。

狀態表示:c[i][j] 表示將前i種物品放入體積為j的揹包中,獲得的最大重量。

第i個物品處理狀態 2種:

不放入:放入揹包的重量不增加(跟第i-1個物品一樣),c[i][j] = c[i-1][j]。

放入:問題可轉化為,在第i-1階段向第i階段轉化。因為第i階段已經放入體積v[i](重量w[i]),所以第i-1階段體積j-v[i],此時可以知道c[i][j] = c[i-1][j-v[i]] + w[i]

特殊情況:揹包體積不夠,則肯定不能放入物品,有c[i][j] = c[i-1][j],j < v[i]

因此,可以得到狀態轉移方程:

當j < v[i]時,c[i][j] = c[i-1][j]

當j >= v[i]時,c[i][j] = max(c[i-1][j], c[i-1][j-v[i]] + w[i])

而初始狀態:

c[0..n][j] = 0,c[i][0..v] = 0

因此,可以通過狀態轉移方程得到所有c[i][j]值,而c[n][v]就是所求。

**:

/**

* **中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可

* 計算01揹包問題的結果

* @param v int整型 揹包的體積

* @param n int整型 物品的個數

* @param vw int整型vector> 第一維度為n,第二維度為2的二維陣列,vw[i][0],vw[i][1]分別描述i+1個物品的vi,wi

* @return int整型

*/int knapsack(int v, int n, vector>& vw)

else }}

return c[n][v];

}

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