動態規劃0 1揹包

2022-06-30 09:03:10 字數 2082 閱讀 1792

一、問題描述:

有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

二、動態規劃的原理及過程:

eg:number=4,capacity=8

1

2

3

4

w(體積)23

45v(價值)34

56

1.原理

動態規劃是把大問題拆分成小問題,通過尋找大問題與小問題的遞推關係,解決乙個個小問題,最終達到解決原問題的效果。動態規劃則通過填寫表把所有已經解決的子問題答案紀錄下來,在新問題裡需要用到的子問題可以直接提取,避免了重複計算,從而節約了時間,所以在問題滿足最優性原理之後,用動態規劃解決問題的核心就在於填表,表填寫完畢,最優解也就找到。

2.過程

(1)用v[i]表示物品價值,w[i]表示物品重量。定義狀態dp[i][j]以j為容量為放入前i個物品(按i從小到大的順序)的最大價值。

(2)初始化邊界條件,v(0,j)=v(i,0)=0;

(3)對於每乙個物品,有兩種選擇方法,能裝下和不能裝下。

第一,包的容量比該商品體積小,裝不下,此時的價值與前i-1個的價值是一樣的,即v(i,j)=v(i-1,j);

第二,還有足夠的容量可以裝該商品,但裝了也不一定達到當前最優價值,所以在裝與不裝之間選擇最優的乙個,即v(i,j)=max{ v(i-1,j),v(i-1,j-w(i))+v(i) }其中v(i-1,j)表示不裝,v(i-1,j-w(i))+v(i) 表示裝了第i個商品,揹包容量減少w(i)但價值增加了v(i);

(4)得出遞推關係式:

① j② j>=w(i)     v(i,j)=max{ v(i-1,j),v(i-1,j-w(i))+v(i) }

3.**

1.初始狀態將邊界初始化為0。j表示揹包的的重量,i表示第i個物品,填表方式為一行一行的填,每次填寫的時候取 v(i-1,j),v(i-1,j-w(i))+v(i)中的較大值

2.將陣列更新完則是這樣的情況。隨便取乙個舉例子,比如第二行第五個的7。它是由3,v[2][2]+4=7中的較大值比較出來的。

三、**

對於0-1揹包的**可以有很多種形式,只要是狀態轉移方程正確即可。用二維陣列來儲存****如下。

#include using namespace std;

int w[105], val[105];

int dp[105][1005];

int main()

cout << dp[m][t] << endl;

return 0;

}

四、空間優化

由上面的圖可以看出來,每一次v(i)(j)改變的值只與v(i-1)(x) 有關,v(i-1)(x)是前一次i迴圈儲存下來的值;

因此,可以將v縮減成一維陣列,從而達到優化空間的目的,狀態轉移方程轉換為b(j)= max

並且,狀態轉移方程,每一次推導v(i)(j)是通過v(i-1)(j-w(i))來推導的,所以一維陣列中j的掃瞄順序應該從大到小(capacity到0),否者前一次迴圈儲存下來的值將會被修改,從而造成錯誤。

**:

//求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包承重量t,且價值總和最大。

#include #include int f[1010],w[1010],v[1010];//f記錄不同承重量揹包的總價值,w記錄不同物品的重量,v記錄不同物品的價值

int max(int x,int y)

int main()

}printf("%d",f[t]); //輸出承重量為t的揹包的總價值

printf("\n");

getch();

return 0;

}

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

0 1揹包(動態規劃)

題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...