揹包問題整理

2021-08-09 05:59:40 字數 2593 閱讀 9794

.了解揹包問題:

《講解鏈結1>

《講解鏈結2>

.0/1揹包:

《講解鏈結》

《板子題》

題目描述:

乙個旅行者有乙個最多能用 m 公斤的揹包,現在有 n 件物品,它們的重量分別是 w1 ,w2 ,… , wn ,它們的價值分別為 c1,c2 ,… ,cn 。若每種物品只有一件求旅行者能獲得最大總價值。

輸入格式:

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

第 2..n+1 行:每行二個整數 wi,ci,表示每個物品的重量和價值。

輸出格式:

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

樣例資料 1

輸入:

10 4

2 1

3 3

4 5

7 9輸出:

12**(優化過後):

#include

using

namespace

std;

int n,m;

int w[505],v[505];

int f[505];

int main()

.完全揹包

《講解鏈結》

《板子題》

題目描述:

設有 n 種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為 m ,今從 n 種物品中選取若干件(同一種物品可以多次選取),使其重量的和小於等於 m ,而價值的和為最大。

輸入格式:

第 1 行:兩個整數,m(揹包容量,m<=200)和 n(物品數量,n<=200)。

第 2..n+1 行:每行二個整數 wi,ci,表示每個物品的重量和價值。

輸出格式:

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

樣例資料 1

輸入:

12 4

2 1

3 3

4 5

7 9輸出

15**:

#include

using

namespace

std;

int n,m;

int w[505],v[505];

int f[505];

int main()

.二維揹包

個人理解:類似一維的揹包問題,只不過要開二維陣列,多乙個考慮條件,多一層for迴圈。

《講解鏈結》

例題:hdu 2159 – fate

題目描述:

最近xhd正在玩一款叫做fate的遊戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來公升完這最後一級。現在的問題是,xhd昇掉最後一級還需n的經驗值,xhd還留有m的忍耐度,每殺乙個怪xhd會得到相應的經驗,並減掉相應的忍耐度。當忍耐度降到0或者0以下時,xhd就不會玩這遊戲。xhd還說了他最多隻殺s只怪。請問他能昇掉這最後一級嗎?

輸入格式:

輸入資料有多組,對於每組資料第一行輸入n,m,k,s(0 < n,m,k,s < 100)四個正整數。分別表示還需的經驗值,保留的忍耐度,怪的種數和最多的殺怪數。接下來輸入k行資料。每行資料輸入兩個正整數a,b(0 < a,b < 20);分別表示殺掉乙隻這種怪xhd會得到的經驗值和會減掉的忍耐度。(每種怪都有無數個)

輸出格式:

輸出公升完這級還能保留的最大忍耐度,如果無法公升完這級輸出-1。

樣例資料 1

輸入:

10 10 1 10

1 1

10 10 1 9

1 1

9 10 2 10

1 1

2 2輸出:

0 -1

1**:

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,m,k,s;

int a[505],b[505];

int f[505][505];

inline

void work()

}if(f[x][s]>=n)

break;

}if(x>m) cout

<<"-1"

cout

return

0;}

.多重揹包

《講解鏈結》

.分組揹包

《講解鏈結》

.揹包問題總結

《鏈結.經典揹包九講》

1.hdu 2955 robberies 01揹包

2.hdu 1864 最大報銷額 01揹包

3.hdu 2602 bone collector 01揹包

4.hdu 2844 coins 多重揹包

5.hdu 2159 fate 二維揹包/完全揹包

6.hdu 1712 acboy needs your help 分組揹包

揹包dp整理

01揹包 動態規劃是一種高效的演算法。在數學和電腦科學中,是一種將複雜問題的分成多個簡單的小問題思想 分而治之。因此我們使用動態規劃的時候,原問題必須是重疊的子問題。運用動態規劃設計的演算法比一般樸素演算法高效很多,因為動態規劃不會重複計算已經計算過的子問題。因為動態規劃又可以稱為 記憶化搜尋 01...

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

01揹包問題 完全揹包問題 多重揹包問題

0 1 揹包問題 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析一波,面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次。解決辦法 宣告乙個 大...