首先讓我們回顧一下動態規劃法的使用規則:
1、劃分子問題:將元問題分解為若干個子問題,每乙個子問題對應乙個決策,並且子問題之間具有重疊關係
2、確定動態規劃函式:根據子問題之間的重疊關係找到子問題滿足的遞迴關係式(即動態規劃函式),這是實現思路的關鍵。
3、填寫**:設計**,自下而上的方式計算各個子問題的解並填表,實現動態規劃過程。
給定n中物品和乙個揹包,物品i(1<=i<=n)的重量是wi,其價值為vi,揹包容量為c,對每種物品只有兩種選擇:裝入揹包或不裝入揹包,如何選擇裝入揹包的物品,是的裝入揹包的總價值最大?
解題思路:
我們設v(i,j):表示前 i 個物品中某些物品和第 i 個物品放入容量為 j 的揹包(書上的解釋是:將前 i 個物品裝入容量為 j 揹包中(當然也包括第 i 個)),我認為書上的這種解釋有待商榷,因為前 i 個物品不都會裝入!!
這時候要考慮四個問題:
1.能裝入(揹包容量足夠)
2.能裝入的情況下:裝入
3.能裝入的情況下:不裝入
4.不能裝入(揹包容量不夠)
是不是有點繞,來解釋一波:
1、揹包容量不足:當我們揹包的容量不夠的情況下,肯定是不能裝入的,這思路很清晰,所以這個時候表示v(i,j)的價值和v(i-1,j)的價值一樣,因為第 i 個沒有放入。
2、揹包容量足夠:這時候肯定有人要問了,既然揹包容量都足夠放第 i 個,為啥不放進去呢?還會有不放入的情況呢?只要是放入價值肯定更大啊?我的解釋:當我們將第 i 物品裝入不一定達到當前最優解,應當在即v(i,j)=max{v(i-1,j),v(i-1,j-w(i))+v(i)}中選出最優的解!如果前者更大:表示這第 i 個物品沒有加入,如果後者更大:表示裝入了第 i 個!
2、如果還沒有理解透徹,我這有乙個栗子:假設我們以能裝就裝的原則,你可能會裝的很滿,那如果我最後乙個物品重量為2,價值乙個億!!!,那你前面都裝了,就裝不下這乙個億的價值的東西了,因為我們前面所做的一切操作要考慮會面的情況,並不是找區域性的最優解,而是整體考慮填表去尋找整體的最優解,因為區域性的最優加起來不能代表全體的最優!
3、我們加速,列出動態函式:
v(i,j)=v(i-1,j) j=wi ;(能裝下,前者不裝,後者裝)
4、ok我們開始列出我們另乙個函式:關於物品取與不取的關係xi:
xi=0;表示第 i 個物品沒有放入 v(i,j)= v(i-1,j)
xi=1;表示第 i 個物品放入 v(i,j)> v(i-1,j) 或 v(i,j)= v(i-1,j-wi)+vi
**5、**列出動態規劃**
我們假設有5個物品,重量w, 價值v,揹包容量為8.
1.首先邊界初始化:v(0,j)= v(i,0)=0
2.如,i=1,j=1,w(1)=2,v(1)=3,有jw(4),故v(4,8)=max{ v(4-1,8),v(4-1,8-w(4))+v(4) }=max{9,4+6}=10……
最終答案:v(4,8)=10;
**實現
int
knapsack
(int w,
int v,
int n,
int c)
for(j=
1;j<=c;j++
)for
(i=1
;i<=n;i++
)else
}for
(j=c,i=n;i>
0;i--
)else x[i]=0
;}return v[n]
[c];
}
動態規劃法解決0 1揹包問題 C
1.動態規劃法的設計思想 動態規劃法將待求解問題分解成若干個相互重疊的子問題,每個子問題對應決策過程的乙個階段,子問題的重疊關係一般表現在對給定問題求解的遞推關係,將子問題的的解求解一次並且填入表中,當需要再次求解子問題的時候,可以通過查表獲得這個子問題的解而不是再次求解,從而避免大量重複計算,為了...
0 1揹包問題 動態規劃法
問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...
0 1揹包問題 動態規劃法
問題描述 給定n種物品和一揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 1揹包問題。資料...