題目鏈結
從1開始,f[i][j]表示前i個物品占用j空間的最大價值。
v表示第i件物品的體積,p表示第i件物品的價值。
f[i][j]可以有兩個轉移**。
時間複雜度o(n
m)
o(nm)
o(nm
)
#include
#include
using
namespace std;
const
int n =
1010
;int f[n]
[n];
int v[n]
, w[n]
;int n, m;
intmain()
}}int res =0;
for(
int i =
1; i <= m; i++
) res =
max(res, f[n]
[i])
; cout
}
使用滾動陣列將二維的資料優化為一維,降低了空間複雜度。
直接套模板
//物品數量是5 最大容量是 20
int d[21]
=;void
knapsack2()
}}
#include
using namespace std;
int dp[6]
[21]=
;//dp[i][c]表示前i件物品恰好裝入容量為c的揹包所能獲得的最大價值
int d[21]
=;int w=
;//讀入的時候做個偏移
int v=
;//物品數量是5 最大容量是 20
void
knapsack()
}}//物品數量是5 最大容量是 20
void
knapsack2()
}}intmain()
01揹包精講
給定乙個物品集合s 物品i具有重量wi和價值vi。揹包能承受能承受的最大載重量不超過w。揹包問題就是找到乙個物品子集s 屬於s,使得maxewi w。所謂01揹包就是物品要麼整個地選取,要麼不取。首先我們先要肯定一件事,假設子問題 i,w 的最優裝載中含有物品i,則其中的子問題 i 1,w wi 的...
揹包精講之 01揹包
了解01揹包時應該注意01揹包在問法上的差別 初始化分兩種情況 1 如果揹包要求正好裝滿則初始化 f 0 0,f 1 w inf 2 如果不需要正好裝滿 f 0 v 0 題目 有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。整...
揹包九講之 01揹包
01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...