0 1揹包使用一維陣列

2021-06-21 11:22:27 字數 1146 閱讀 4294

使用滾動陣列將空間優化到了2*v,在揹包九講中提到了使用一維陣列也可以達到同樣的效果,個人認為這也是滾動思想的一種,由於使用一維陣列解01揹包會被多次用到,完全揹包的一種優化實現方式也是使用一維陣列,所以我們有必要理解這種方法。

如果只使用一維陣列f[0…v],我們要達到的效果是:第i次迴圈結束後f[v]中所表示的就是使用二維陣列時的f[i][v],即前i個物體面對容量v時的最大價值。我們知道f[v]是由兩個狀態得來的,f[i-1][v]和f[i-1][v-c[i]],使用一維陣列時,當第i次迴圈之前時,f[v]實際上就是f[i-1][v],那麼怎麼得到第二個子問題的值呢?事實上,如果在每次迴圈中我們以v=v…0的順序推f[v]時,就能保證f[v-c[i]]儲存的是f[i-1][v-c[i]]的狀態。狀態轉移方程為: 1

v = v...0; f(v) = max

我們可以與二維陣列的狀態轉移方程對比一下 1

f(i,v) = max

正如我們上面所說,f[v-c[i]]就相當於原來f[i-1][v-c[i]]的狀態。如果將v的迴圈順序由逆序改為順序的話,就不是01揹包了,就變成完全揹包了,這個後面說。這裡舉乙個例子理解為何順序就不是01揹包了

假設有物體z容量2,價值vz很大,揹包容量為5,如果v的迴圈順序不是逆序,那麼外層迴圈跑到物體z時,內迴圈在v=2時,物體z被放入揹包,當v=4時,尋求最大價值,物體z放入揹包,f[4]=max,這裡毫無疑問後者最大,那麼此時f[2]+vz中的f[2]已經裝入了一次物體z,這樣一來該物體被裝入揹包兩次了就,不符合要求,如果逆序迴圈v,這一問題便解決了。

**如下,為了加深理解,可以在內迴圈結束輸出每乙個狀態的情況到文字中,會發現與使用二維陣列時的狀態轉移矩陣都是一樣一樣的。

#include

using namespace std;

int maxv[201];

int weight[11];

int value[11];

int v, n;

void main()

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

}printf("%d",maxv[v]);

}

可以看出,使用一維陣列,**非常簡練。

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

一維dp陣列01揹包

有n件物品和乙個最多能被重量為w 的揹包。第i件物品的重量是weight i 得到的價值是value i 每件物品只能用一次,求解將哪些物品裝入揹包裡物品價值總和最大。這是標準的揹包問題,以至於很多同學看了這個自然就會想到揹包,甚至都不知道暴力的解法應該怎麼解了。這樣其實是沒有從底向上去思考,而是習...

小梁的揹包(01揹包 一維陣列)

時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 小梁來到了伽勒爾地區並參加了聯盟賽熱身賽,比賽小島上有n個精靈散落在島上各處,她有乙個大小為s的揹包,每個精靈的戰鬥值為vi 體積為wi 請問在她臨走之前...

0 1揹包問題(一維陣列解法)

0 1揹包問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題的特點是 每種物品只有一件,可以選擇放或者不放。演算法基本思想 利用動態規劃思想 子問題為 f i v 表示前i件物品恰放入乙個...