0 1揹包使用滾動陣列壓縮空間

2021-06-20 13:20:22 字數 790 閱讀 9627

所謂滾動陣列,目的在於優化空間,從上面的解法我們可以看到,狀態轉移矩陣使用的是乙個n*v的陣列,在求解的過程中,我們可以發現,當前狀態只與前一狀態的解有關,那麼之前儲存的狀態資訊已經無用了,可以捨棄的,我們只需要空間儲存當前的狀態和前一狀態,所以只需使用2*v的空間,迴圈滾動使用,就可以達到跟n*v一樣的效果。這是乙個非常大的空間優化。

**如下,我們可以在每輪內迴圈結束後輸出當前狀態的解,與上面使用二維陣列輸出的狀態轉移矩陣對比,會發現是一樣的效果,重定向輸出到文字有助加深理解。

#include

using namespace std;

int maxvalue[2][201];

int weight[11];

int value[11];

int v, n;

void main()

for(i= 0; i < n; ++i)

}else }}

printf("%d",maxvalue[k][v]);

freopen("c:\\dp.txt","w",stdout);

for(i= 0; i <= 1; ++i)

printf("\n");

}}

這種空間迴圈滾動使用的思想很有意思,類似的,大家熟悉的斐波那契數列,f(n) =f(n-1) +f(n-2),如果要求解f(1000),是不需要申請1000個大小的陣列的,使用滾動陣列只需申請3個空間f[3]就可以完成任務。

****************************************

01揹包 1維 滾動陣列

這裡先說一下二維的。01揹包 設物品有n件物品,揹包容量為w int w 代表n件物品的價值 int pw 代表n件物品各佔的容量 int f n 50 w 50 最優解二維陣列 f i j 陣列 代表存i件物品在容量為j的揹包中得到的價值 void package 01 printf d n f ...

揹包九講 01揹包問題(dp 滾動陣列)

現在有n件物品和乙個容量為v的揹包。第i件物品的費用是cost i 價值是value i 每個物品最多只能選一次,求解在不超過揹包容量的限制下,如何選取物品組合能使收益最大化?題型有兩種,一種要求揹包恰好放滿,一種不要求揹包恰好放滿 現在考慮第二種題型,即不要求揹包恰好放滿 將問題分解成子問題 有i...

用滾動陣列求解0 1揹包問題

由於第i個階段 考慮物品i 的解dp i 只與第i 1個階段 考慮物品i 1 的解dp i 1 有關,這種情況下儲存更前面的資料已經毫無意義。因此可以利用滾動陣列進行優化,將dp陣列由dp maxn maxn 改為dp 2 maxn 因此0 1揹包問題的狀態轉移方程如下 dp 0 0 0,dp 1 ...