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++)
}
//舉例推導dp陣列weight陣列的大小 就是物品個數
for(int j = 0; j <= bagweight; j++)
}
來看一下對應的dp陣列的數值,如圖:
#includeusingnamespace
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 考...