利用0 1揹包問題談動態規劃

2021-08-09 16:50:45 字數 2847 閱讀 6732

維基百科的定義:

- 動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。引自維基百科

dynamic programming is a method

forsolving

acomplex

problem

bybreaking

itdown

into

acollection

of******r

subproblems.

動態規劃是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。如何拆分問題,才是動態規劃的核心。而拆分問題,靠的就是狀態的定義和狀態轉移方程的定義。

(1)滿足動態規劃的最優化原理:

作為整個過程的最優策略具有如下性質:無論過去的狀態和決策如何,對前面的決策所形成的當前狀態而言,餘下的諸決策必須構成最優策略。 可以通俗地理解為子問題的區域性最優將導致整個問題的全域性最優,即問題具有最優子結構的性質,也就是說乙個問題的最優解只取決於其子問題的最優解,非最優解對問題的求解沒有影響。

(2)滿足動態規劃的無後效性原則:

所謂無後效性原則,指的是這樣一種性質:某階段的狀態一旦確定,則此後過程的演變不再受此前各狀態及決策的影響。也就是說,「未來與過去無關」,當前的狀態是此前歷史的乙個完整總結,此前的歷史只能通過當前的狀態去影響過程未來的演變。具體地說,如果乙個問題被劃分各個階段之後,階段 i 中的狀態只能由階段 i+1 中的狀態通過狀態轉移方程得來,與其他狀態沒有關係,特別是與未發生的狀態沒有關係,這就是無後效性。

1、狀態的定義

2、狀態轉移方程的建立

狀態即問題的子問題,之所以叫狀態是為了防止混淆原問題,用計算機來表示就是用哪些變數儲存哪些資料。狀態轉移方程,當狀態定義好後,他們之間的轉換關係就是狀態轉移方程,用計算機表示就是怎樣根據一些變數計算出另一些變數。下面我將通過0-1揹包問題來像大家解釋以上概念,方便大家理解。

現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w[i],價值是v[i]。已知對於一件物品必須選擇取(用1表示)或者不取(用0表示),且每件物品只能被取一次(這就是「0-1」的含義)。求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。

這個問題特點是,每種物品只有一件,可以選擇放或者不放, 假設我們從沒見過這個題,所以我們要先分析下是不是適合使用動態規劃,先從第一點來看是不是符合最優子結構。設揹包最大容量c,如果某個狀態的最優解包含了物品n,那麼其餘x1、x2、…xn-1 一定構成了子問題1,2,…n-1在容量為c-cn適合的最優解,如果這個最優解不包含物品n,那麼其他x1…xn-1 一定構成了子問題 1、2…n-1在容量為c時候的最優解。我們可以用反證法來證明上述,如果在某個狀態的最優解包含了物品n,如果在其餘x1、x2、…xn-1

沒有構成子問題1,2,…n-1在容量為c-cn適合的最優解,那麼必定存在乙個其他組合方式能使該子問題達到最優解的,那麼這就與題目1、2…n-1在容量為c時候的最優解衝突了。因為假設某個問題最優解包含了物品n的時候的價值是8,體積為8,如果去掉物品n後價值為5,體積為5,如果其他物品沒有構成在體積為5下的最優解的話,那麼就存在其他組合方式能讓體積為5的時候價值大於5,那麼再加上物品n的話總價值就會大於8,與假設不符,因為假設是8為最優。所以通過上述分析,該問題是具備最優子結構性質的。

那麼再來看看是不是符合無後效性,當你知道物品總體積為c的時候你想加入乙個cn,所以加入之前體積為c-cn,假設價值為x,加入後價值為y,你根本不用管這x怎麼來的,到底是加入了哪些物品才得到了x,這些你都不用管,因為y的得到只需要x加上物品n的價值就行了,不關心你怎麼來的,所以x為以前歷史的乙個總結。

int c[n]; //儲存物體體積

int v[n];//儲存物體價值

int i,j; //物品序號、當前體積。

1、狀態定義

我們可以先這樣考慮,當揹包容量為1時,如何放置物品才能使揹包中價值最大;同樣當揹包容量為2時,如何放置能使揹包中價值最大,以此類推,直到揹包容量為10。此時我們需要維護一張二維表m[i][j],其中橫座標i表示物品,縱座標表示揹包容量(1<=j<=10)。

0-1揹包問題的遞推二維表

可以將每個重量的時候看成是乙個狀態。

2、狀態轉移方程式建立

通過上表可以看到,當橫座標到了一定體積的時候,如果當前c[i]小於j,那麼就可以選擇加入 或者不加入,如果加入後總價值比原來的大,那麼肯定加進去,如果沒有原來大則不加。當前價值為m[i-1][j],加入前價值為m[i-1][j-c[i]],加入後價值為加入前加上物品重價值,即m[i-1][j-c[i]+v[i],通過上述便可建立狀態轉移方程式了。

(1)i=0 當j<c[0]時,m[0][j]=0;當j>=c[0]時,m[0][j]=v[0]。

(2)i>0 當j<c[i],m[i][j]=m[i-1][j];當j>=c[i],m[i][j]=max。

這兒我只列出核心演算法**

for(int i=1;ifor(int j=1;j<=c;j++)else

}}

至此利用0-1揹包問題談動態規劃已經結束了。總結一下,其實動態規劃是用來解決一類問題的,其核心應該是狀態定義,而不是狀態轉移方程式的建立。乙個問題狀態的定義有很多種,狀態轉移方程式也有很多種,甚至存在乙個有後效性的定義,但是並不代表不能用動態規劃,只是不適合罷了。動態規劃是尋找一種對問題的觀察角度,讓問題能夠以地推或者分治的方式去解決。所以尋找看問題的角度,才是動態規劃中最耀眼的寶石。

感謝

動態規劃理解 徐凱強

0-1揹包詳解

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...

0 1揹包問題(動態規劃)

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用動態規劃求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,最...