一本通1267 01揹包問題(深度搜尋 動態規劃)

2021-09-29 16:48:09 字數 1307 閱讀 7261

1267 01揹包問題

【題目描述】

乙個旅行者有乙個最多能裝 mm 公斤的揹包,現在有 nn 件物品,它們的重量分別是w1,w2,…,wnw1,w2,…,wn,它們的價值分別為c1,c2,…,cnc1,c2,…,cn,求旅行者能獲得最大總價值。

【輸入】

第一行:兩個整數,mm(揹包容量,m≤200m≤200)和nn(物品數量,n≤30n≤30);

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

【輸出】

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

【輸入樣例】

10 4

2 13 3

4 57 9

【輸出樣例】

12個人思路:

本道題是一道動態規劃問題,使用深度優先搜尋。

此問題是探索每乙個物體是否要放入揹包,放與不放有兩種選擇,每一層次是乙個物品。一共2^n中放法。葉子結點是方案。

剪枝:1、如果這個物品的重量大於揹包剩餘重量的話,放不了,剪掉。

2、如果不放這個物品的話,剩餘沒有在揹包中的物品的總價值沒有這個物品的價值大的話,那就沒有必要探索這條路了(反正剩下的所有物品都放進去的話也不會有放這個物品的價值大),剪掉。

如圖:

**:

#include

#include

#include

using

namespace std;

int m,n;

int v[31]

[2];

//物體的重量和價值

bool b[31]

;//標記物體的陣列

int value=0;

//揹包現在裝載的價值

int value_max=0;

//揹包裝的最大價值

int value_sheng=0;

//剩餘沒有裝的物品的總價值

int w_sheng;

//揹包剩餘重量

intdfs

(int i)

//第幾個物體

if(b[i]==0

&&v[i][0

]<=w_sheng)

//如果這個物品沒被裝,且它的重量揹包可以承受的話

}else

//不能裝這個物品

}int

main()

dfs(1)

; cout<

return0;

}

1267 01揹包問題

乙個旅行者有乙個最多能裝 m 公斤的揹包,現在有 n 件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn,求旅行者能獲得最大總價值。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2.n 1行 每行二個整數wi,ci,表示每個物品的重量和價值。僅一行,...

完全揹包變式 一本通 1293 買書

1293 買書 題目描述 小明手裡有n元錢全部用來買書,書的 為10元,20元,50元,100元。問小明有多少種買書方案?每種書可購買多本 輸入 乙個整數 n,代表總共錢數。0 n 1000 輸出 乙個整數,代表選擇方案種數。輸入樣例 20 輸出樣例 2 提示 樣例輸入 樣例輸入2 15樣例輸入3 ...

CJOJ 2307 一本通 完全揹包(動態規劃)

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 同一種物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2.n 1行 每行二個整數wi,u...