略略
我們的狀態陣列f[i
][j]
f[i][j]
f[i][j
]指在揹包有j
jj的容量,只有前i
ii件物品時的最大價值
由於每種物品只有選與不選兩種情況
所以如果容量允許,那麼f[i
][j]
f[i][j]
f[i][j
]只有兩種選擇
選擇第i
ii件物品,或不選
(狀態轉移方程見**)
然鵝,我們可以使用一些奇妙的手段去掉陣列的一維,是空間複雜度更低
即去掉i
ii這一維,使用陣列表示揹包有j
jj的容量時的最優解
這裡有個細節,就是在進行遞推的時候,j
jj必須從大到小進行遍歷
否則會使用乙個更新過的值更新接下來的值
具體見**
o (n
∗m
)o(n*m)
o(n∗m)
#include using namespace std;
int f[1000][1000];
int w[1000];
int v[1000];
int main()
}cout
}
題解 01揹包
描述 乙個旅行者有乙個最多能裝 m 公斤的揹包,現在有 n 件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn,求旅行者能獲得最大總價值。輸入第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2 n 1行 每行二個整數wi,ci,表示每個物品的重量和價值...
Dima and Salad 題解 01揹包變形
給你n個物品,每個物品有兩個值乙個為a,乙個為b 要你拿任意的物品使得 sum a sum b k 且max sum a 1 n 100 1 k 10 1 a i b i 100 乙個顯然易見的思路設 dp i j 為是否有 sum a i sum b j 然後最後複雜度為 o 1e10 顯然不行 ...
揹包 01揹包
01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...