動態規劃的01揹包

2021-08-30 09:09:47 字數 2309 閱讀 1841

特點是:每種物品僅有一件,可以選擇放或不

放。用子問題定義狀態:即 f[i,v] 表示前 i 件物品恰放入乙個容量為 v 的揹包可

以獲得的最大價值。則其狀態轉移方程便是:

f[i,v] = max

杭電2602題

傳送門:杭電2602題

坑點:1

5 02 4 1 5 1

0 0 1 0 0

答案是12

過了題目資料和這組資料,基本就能ac了~

基本思路:「將前 i 件物品放入容量為 v 的揹包

中」這個子問題,若只考慮第 i 件物品的策略(放或不放),那麼就可以轉化

為乙個只和前 i − 1 件物品相關的問題。如果不放第 i 件物品,那麼問題就轉化

為「前 i − 1 件物品放入容量為 v 的揹包中」,價值為 f[i − 1,v] ;如果放第 i 件物

品,那麼問題就轉化為「前 i − 1 件物品放入剩下的容量為 v − c i 的揹包中」,

此時能獲得的最大價值就是 f[i − 1,v − c i ] 再加上通過放入第 i 件物品獲得的

偽**如下:

f[0,0…v ] ← 0

for i ← 1 to n

for v ← c i to v

f[i,v] ← max

#include#include#includeusing namespace std;

int n,m; //n為物品的個數,m為書包的承重

int value[1005]; //value為各物品的價值

int weight[1005]; //weight為個物品的重量

int dp[1005][1005]; //dp陣列

int bag() //0-1揹包

} return dp[n][m]; //返回結果

}int main()

由dp[i][w]=max(dp[i-1][w-w[i]]+c[i], dp[i-1][w]可以看出要求第i組的dp [w]需要的是第i-1組的dp[w-w[i]]+c[i]和dp[w],即求dp[w]時需要當前的資料和w位置前的資料,因此求第i組的時候需要逆序求解,這樣可以保證求dp[w]時所需的兩個資料都是上一組的,而且當w<w[i]時dp[w]=dp[w],

#include#include#includeusing namespace std;

int n,m; //n為物品的個數,m為書包的承重

int value[1050]; //value為各物品的價值

int weight[1050]; //weight為個物品的重量

int dp[1050]; //dp陣列

int bag() //0-1揹包

return dp[m]; //返回重量m的最大價值

}int main()

{ int result,t;

cin>>t; //輸入例子數

while(t--)

{ cin>>n>>m;

for(int i=1;i<=n;i++)

cin>>value[i]; //輸入價值

for(int i=1;i<=n;i++)

cin>>weight[i]; //輸入重量

result=bag(); //得到結果

cout《我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。

有的題目要求「恰好裝滿揹包」時的最優解,有的題目則並沒有要求必須把背

包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。

如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了 f[0] 為 0 ,其

它 f[1…v ] 均設為 −∞ ,這樣就可以保證最終得到的 f[v ] 是一種恰好裝滿揹包的

最優解。

如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該

將 f[0…v ] 全部設為 0 。

這是為什麼呢?可以這樣理解:初始化的 f 陣列事實上就是在沒有任何物

品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量

為 0 的揹包可以在什麼也不裝且價值為 0 的情況下被「恰好裝滿」,其它容量的

揹包均沒有合法的解,屬於未定義的狀態,應該被賦值為-∞了。如果揹包並非

必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,這個解的

價值為 0 ,所以初始時狀態的值也就全部為 0 了。

這個小技巧完全可以推廣到其它型別的揹包問題。

《揹包問題九講 》崔添翼 (tianyi cui)

動態規劃 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的揹包可以獲得的最大價值。則其狀態轉移方程...