揹包問題 01揹包

2022-09-20 23:15:14 字數 1254 閱讀 6822

b站課程有助於理解

對於揹包問題,有一種寫法,

1.定義:是使用二維陣列,即dp[i][j] 表示從下標為[0-i]的物品裡任意取,放進容量為j的揹包,價值總和最大是多少

2.確定遞推公式:再回顧一下dp[i][j]的含義:從下標為[0-i]的物品裡任意取,放進容量為j的揹包,價值總和最大是多少。

那麼可以有兩個方向推出來dp[i][j],

所以遞迴公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3.dp陣列初始化

for (int j = 0 ; j < weight[0]; j++) 

//正序遍歷

for (int j = weight[0]; j <= bagweight; j++)

4.確定遍歷順序

在如下圖中,可以看出,有兩個遍歷的維度:物品與揹包重量在二維陣列的dp,我們分析得到:先從那個遍歷都不影響結果

//

weight陣列的大小 就是物品個數

for(int i = 1; i < weight.size(); i++)

}

//

weight陣列的大小 就是物品個數

for(int j = 0; j <= bagweight; j++)

}

舉例推導dp陣列

來看一下對應的dp陣列的數值,如圖:

#includeusing

namespace

std;

void

test_2_wei_bag_problem1() ;

vector

value = ;

int bagweight = 4

;

//二維陣列

vectorint>> dp(weight.size(), vector(bagweight + 1, 0

));

//初始化

for (int j = weight[0]; j <= bagweight; j++)

//weight陣列的大小 就是物品個數

for(int i = 1; i < weight.size(); i++)

}cout

<< dp[weight.size() - 1][bagweight] <

}int

main()

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

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...