藍橋杯 演算法提高 01揹包

2021-09-23 10:19:00 字數 1155 閱讀 2511

給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.

輸入格式

輸入的第一行包含兩個整數n, m,分別表示物品的個數和揹包能裝重量。

以後n行每行兩個數wi和vi,表示物品的重量和價值

輸出格式

輸出1行,包含乙個整數,表示最大價值。

樣例輸入

3 52 3

3 54 7

樣例輸出

資料規模和約定

1<=n<=200,m<=5000.

這道題就是最經典,最簡單的01揹包問題了,直接用01揹包就可以得到結果。

關於01揹包,就是有n件物品,乙個揹包能夠放入的重量是m,讓你求出來揹包中物品的最大價值;

對於揹包,我們可以找到乙個遞推公式:

(1)當揹包中剩餘可放入物品的重量比這件物品的重量小,那麼這件物品不能放入揹包中;

(2)當揹包中剩餘可放入物品的重量比這件物品的重量大,那麼這件物品可以放入揹包中,也可以不放進揹包中;

用乙個二維陣列來記錄這個判斷的過程:dp[ ][ ] ;   

其中,dp[x ][y ]=z:代表,現在在前x件物品中進行選擇,揹包剩餘的重量是y,其中,現在這種情況下揹包中最大的價值是z;

那麼上面的遞推公式就可以表示為:

dp[i][j]=dp[i-1][j];

//揹包放不進去了,那麼這件物品不能選,所以在前i件物品中選擇的最大的價值和前面i-1件物品中進行選擇的最大的價值相同;

dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);

//揹包可以放進去這件物品,那麼在前i見物品中進行的選擇的物品可能會被替換,換或者不換有兩種結果,要從這兩種結果中選出來最優的結果;上面的式子即使選和不選兩種結果的抉擇;

#include#include#includeusing namespace std;

int n,m;

int w[5010],v[5010];

int dp[5010][5010];

int main()

for(int i=1; i<=n; i++)//數量;

}printf("%d\n",dp[n][m]);

}return 0;

}

藍橋杯 演算法提高 01揹包

問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和vi,表示物品的重量和價值 輸出格式 輸出1行,包含乙個整數,表示最大價...

藍橋杯 ADV 144 演算法提高 01揹包

演算法提高 01揹包 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和v...

藍橋杯 01揹包

演算法提高 01揹包 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.輸入格式 輸入的第一行包含兩個整數n,m,分別表示物品的個數和揹包能裝重量。以後n行每行兩個數wi和v...