前言:上篇suibi寫到了01揹包的二維陣列做法(不知道的戳這),可是空間太大了,如果出題人有意,那你就
怎麼辦呢?那咱們就用一維陣列來存吧。
****:
#includeusing namespace std;
int bag,n,v[101],w[101],dp[1001];
int main()
} cout變數同上。
同樣列舉每一種物品,重量從後往前列舉。
看圖:
這樣從後往前枚,就可以避免重複了,因為01揹包每種物品只能選一次。例如從12沒枚2,發現0+2=2!於是二就有了方案。
從12列舉到5,發現2滿了,而2+3=5!於是5也有了方案。再枚下去,發現0+3=3!於是,三也有了方案。以此類推,我們發現
不需要列舉陣列第乙個下標即物品的編號!於是就有了
for(int i=1;i<=n;i++)
}
是不是和二維思路差不多!其實挺簡單的 看懂0 1揹包與完全揹包的空間優化
0 1揹包的主要思路就是 這件物品,取還是不取。用乙個二維陣列dp i v 來表示對第i個物品,揹包容量為v時的情況。c i 表示第i件物品的體積,w i 表示第i件物品的價值。那麼考慮第i件物品取與不取 如果不取,那麼就可以轉化為i 1件物品 容量仍然為v 價值沒有增加的情況 dp i 1 v 如...
01揹包 一維空間優化
01揹包是最最基礎的揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接...
01揹包及其優化
動態規劃是解決變成問題的一種重要思想,而揹包則是動態規劃的一種。揹包問題 給你乙個容量為v的揹包以及一些具有價值wi和體積vi的一些物品,要你求出揹包所能裝的最大價值。解決方法 定義乙個陣列f i v 用來統計各種情況下,揹包所能裝的最大價值,其中,i代表當前只提供前i個物品給你選擇,v表示當前只提...