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...