ACM競賽學習整理開篇之01揹包問題

2021-10-01 20:16:11 字數 2740 閱讀 6205

最近,偶然的一次機會讓我關注資訊奧賽的一些內容。發現其中的內容很有趣,是學習程式設計的一條很好的路徑,又能很好地將數學和程式設計聯絡到一起。在csdn裡看到了不少同好也在學習acm競賽。於是,決定通過csdn這個平台來記錄,我的acm學習之路。

揹包問題已經研究了乙個多世紀,早期的作品可追溯到2023年 [1] 數學家託比亞斯·丹齊格(tobias dantzig,1884-1956)的早期作品 [2] ,並指的是包裝你最有價值或有用的物品而不會超載你的行李的常見問題。

2023年的石溪布魯克大學演算法庫的研究表明,在75個演算法問題中,揹包問題是第18個最受歡迎,第4個最需要解決的問題(前三為後kd樹,字尾樹和bin包裝問題)。

揹包問題出現在各種領域的現實世界的決策過程中,例如尋找最少浪費的方式來削減原材料, [4] 選擇投資和投資組合, [5] 選擇資產支援資產**化 [6] ,和生成金鑰為merkle-hellman [7] 和其他揹包密碼系統。

先了解下3種簡單的揹包概念:

0-1揹包 (zeroonepack): 有n件物品和乙個容量為v的揹包。每種物品均只有一件 第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

完全揹包(completepack):有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

多重揹包 (multiplepack):有n種物品和乙個容量為v的揹包。第i種物品最多有n[i]件可用, 每件費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。*

比較三個題概念,會發現不同點在於每種揹包的數量,01揹包是每種只有一件,完全揹包是每種無限件,而多重揹包是每種有限件。

1、oj 例題

【例題】

有n個物品,編號為i的物品的重量為w[i],價值為c[i],現在要從這些物品中選一些物品裝到乙個容量為m的揹包中,使得揹包內物體在總重量不超過m的前提下價值盡量大。

【輸入】

第1行:兩個整數,n(物品數量,n≤3500)和m(揹包容量,m≤12880)。

第2…n+1行::每行二個整數w[i],c[i],表示每個物品的重量和價值。

【輸出】

僅一行,乙個數,表示最大總價值。

【輸入樣例】

4 61 4

2 63 12

2 7【輸出樣例】

232、解題思路:

用動態規劃的思路,階段就是「物品的件數」,狀態就是「揹包剩下的容量」,那麼很顯然f [ i , v ] 就設為從前 i 件物品中選擇放入容量為 v 的揹包最大的價值。那麼狀態轉移方程為:

f[i][v]=max。
把這個過程理解下:在前i件物品放進容量v的揹包時,

它有兩種情況:

第一種是第i件不放進去,這時所得價值為:f[i-1][v]

第二種是第i件放進去,這時所得價值為:f[i-1][v-w[i]]+val[i]

(第二種是什麼意思?就是如果第i件放進去,那麼在容量v-w[i]裡就要放進前i-1件物品)

最後比較第一種與第二種所得價值的大小,哪種相對大,f[i][v]的值就是哪種。

(這是基礎,要理解!)

3、**求解:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define n 1001

#define mod 2520

#define e 1e-12

using

namespace std;

int m,n;

int w[n]

,c[n]

,f[n]

;void

zeroonepack

(int cost,

int weight)

cout<

}int

main()

4、結果輸出

5、反思總結

揹包問題是貪心演算法的例項,可以根據動態規劃解題步驟來實現

(問題抽象化、建立模型、尋找約束條件、判斷是否滿足最優性原理、找大問題與小問題的遞推關係式、填表、尋找解組成)找出01揹包問題的最優解以及解組成,然後編寫**實現。

回顧01揹包的定義:

題目:**:

1、揹包問題-筆記整理

2、揹包問題 **+詳細解析

3、揹包之01揹包、完全揹包、多重揹包詳解

4、徹底理解0-1揹包問題

ACM 程式設計競賽 DP 01揹包

輸入 n 4 w,v w 5 輸出 7 選擇0,1,3 暴力演算法 o 2 n include using namespace std const int maxn 100 int w maxn v maxn int n,w int rec int i,int j 從第i個商品開始挑選總重量小於j的...

leetcode補充學習之DP 01揹包問題

寫在前面 最近越來越忙了,主要原因是真的太菜了,做個題需要好久,這兩天題涉及還蠻複雜,昨天是dfs與bfs搜尋,我打算等有時間複習一下再一併寫。結果今天居然來了個dp,好傢伙 又不會,只能一步一步來了。今天的題是完全揹包問題,後面再說,這裡只記錄01揹包問題。主要學習狀態轉移函式等。廢話少說 直接放...

演算法學習筆記之基礎dp之(0 1)揹包問題

揹包問題 有多個物品,重量不同 價值不同,以及乙個容量有限的揹包,選擇一些物品撞到揹包中,問怎麼裝才能使裝進揹包的物品總價值最大。根據不同的的限定條件,可以報揹包問題分為很多種,常見的有下面兩種 如果每個物品可以切分,稱為一般揹包問題,用貪心法求最優解。比如吃自助餐,在飯量一定的情況下,怎麼吃才能使...