動態規劃演算法之0 1揹包問題

2021-08-15 11:07:34 字數 2160 閱讀 8341

我們首先來看一下問題:乙個旅行者有乙個容量為c的揹包,現在有n種物品,每件的重量分別是w1、w

2、……、w

n,每件物品的價值分別為v1、v

2、……、v

n, 需要將物品放入揹包中,要怎麼樣放才能保證揹包中物品的總價值最大?具體資料如下表,其中n=4,c=8。

前面已經對動態規劃的基本概念做了詳細的講解,動態規劃演算法的核心是

最優子結構邊界狀態轉移方程式。現在我們來按這個思路對問題進行分析,分別找出以上三種。

演算法分析

這裡用f(n,w)表示前n個物品最佳組合對應的價值,w代表當前揹包容量。

本題的最優子結構是考慮最後一種物品,即第四個。這裡有兩種情況,乙個是第4種物品裝入揹包,則此時問題轉化為前3種物品放入容量為c-w4的空間內,此時的揹包最大值為f(3,8-w4)+v4;另外一種是不選擇將第4種物品放入揹包,則此時的問題是f(3,8)=f(4,8)。所以這裡4種物品和3種物品最優選擇之間存在這樣的關係,即f(4,8)=max(f(3,8),f(3,8-w4)+v4

)。現在我們來確定下問題的邊界是什麼。顯然也有兩種情況,用公式來表示。

當n=1,c>=w1時,f(n,w)= v1;

當n=1,c

f(n,w)=0(n<=1,c

f(n,w)=v1(n==1,c>=w1);

f(n,w)=f(n-1,w)(n>1,c);

f(n,w)=max(f(n-1,w),f(n-1,c-wn)+vn)(n>1,c>=wn)。

到這裡,利用動態規劃求解問題的模型分析已完成,現在來看下怎麼實現。

同樣,我們這裡對其進行一步步的填表,這裡直接給出最後過程。

1) 如,n=1,w=1,w(1)=2,v(1)=3,有w

2) 又如n=1,w=2,w(1)=2,v(1)=3,有w=w(1),故f(1,2)=max{ f(1-1,2),f(1-1,2-w(1))+v(1) }=max{0,0+3}=3;

3) 如此下去,填到最後乙個,n=4,w=8,w(4)=5,v(4)=6,有w>w(4),故f(4,8)=max{ f(4-1,8),f(4-1,8-w(4))+v(4) }=max{9,4+6}=10;所以填完表如上圖。

**填完,最優解即是f(n,c)=f(4,8)=10,但還不知道解由哪些商品組成,故要根據最優解回溯找出解的組成,根據填表的原理可以有如下的尋解方式:

1) f(n,w)=v(n-1,w)時,說明沒有選擇第i 個商品,則回到f(n-1,w);

2) f(n,w)=f(n-1,w-wn)+vn時,說明裝了第i個商品,該商品是最優解組成的一部分,隨後我們得回到裝該商品之前,即回到f(n-1,w-wn);

3) 一直遍歷到n=0結束為止,所有解的組成都會找到。

如上例子,

1) 最優解為f(4,8)=10,而f(4,8)!=f(3,8)卻有f(4,8)=f(3,8-w4)+v4=f(3,3)+6=4+6=10,所以第4件商品被選中,並且回到f(3,8-w4)=f(3,3);

2) 有f(3,3)=f(2,3)=4,所以第3件商品沒被選擇,回到f(2,3);

3) 而f(2,3)!=f(1,3)卻有f(2,3)=f(1,3-w2)+v(2)=f(1,0)+4=0+4=4,所以第2件商品被選中,並且回到f(1,3-w(2))=v(1,0);

4) 有f(1,0)=f(0,0)=0,所以第1件商品沒被選擇。

至此,此0-1揹包問題已經解決。

下面給出**實現:

void findmax()//動態規劃

else//前i-1個物品的最優解與第i個物品的價值之和更大}}

}}

時間效率為o(n*c),由於用到二維陣列儲存子問題的解,所以動態規劃的空間效率為o(n*c)

01揹包問題 (動態規劃演算法)

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波 面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...

01揹包問題 (動態規劃演算法)

題目 給定n種物品和乙個容量為v的揹包,物品i的體積是wi,其價值為ci。每種物品只有乙個 問 如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?面對每個物品,我們只有選擇放入或者不放入兩種選擇,每種物品只能放入一次。我們用之前同樣的思路來走一遍試試 假設只剩下最後一件物品,我們有兩種選擇 ...

動態規劃演算法 01揹包問題

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...