有 n
'>n
件物品和乙個容量是 v
'>v
的揹包。每件物品只能使用一次。
第 i'>
i 件物品的體積是 v
i'>
vi,價值是 w
i'>
wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數n,v
'>n,
v,用空格隔開,分別表示物品數量和揹包容積。
接下來有 n
'>
n 行,每行兩個整數 vi,
wi'>
vi,wi,用空格隔開,分別表示第 i
'>
i 件物品的體積和價值。
輸出格式
輸出乙個整數,表示最大價值。
資料範圍
0v≤1000
'>0
0,wi≤
1000
'>0i,wi
≤1000
輸入樣例
4 5
1 22 4
3 44 5
輸出樣例:8
二維陣列+動規
狀態轉移方程:
定義f[i][j]:前i個物品,揹包容量j下的最優解
1)當前揹包容量不夠(j < w[i]),為前i-1個物品最優解:f[i][j] = f[i-1][j]
2)當前揹包容量夠,判斷選與不選第i個物品
選:f[i][j] = f[i-1][j-w[i]] + v[i]
不選:f[i][j] = f[i-1][j]
1 #include23using
namespace
std;45
const
int maxn = 1005;6
int w[maxn]; //
重量 7
int v[maxn]; //
價值 8
int f[maxn][maxn]; //
f[i][j], j重量下前i個物品的最大價值 910
intmain()
11
2728 cout <29return0;
30 }
降維直接去掉行,注意第二個迴圈,直接用 減
1 #include23using
namespace
std;45
const
int maxn = 1005;6
int w[maxn]; //
重量 7
int v[maxn]; //
價值 8
int f[maxn]; //
[j], j重量的最大價值 910
intmain()
11
2223 cout <24return0;
25 }
揹包九講 01揹包問題
1 01揹包問題描述 已知 有 n 件物品和乙個容量為 v 的揹包。第i件物品的重量為w i 得到的價值是 c i 問題 求解將哪些物品裝入揹包可使價值總和最大。條件 每種物品只有一件,可以選擇放或者不放 2 基本思路 01揹包的特點 每種物品只有一件,可以選擇放或者不放 子問題定義狀態f i v ...
揹包問題九講筆記 01揹包問題
有 n 件物品和乙個容量為 v的揹包 放入第 i 件物品 放入第 i件物品耗費的容量是ci 所獲得的價值是wi 每件物品只有乙個 求將哪些物品放入揹包可使價值總和最大 一般來說求極值的問題可分為貪心,動態規劃,以及遍歷所有可能 在這三中方法中,動態規劃是最常見的,也是很難想出來的 其中最難的是定義子...
揹包問題(一) 0 1揹包問題
揹包問題有多種,比如 問題1 物品受限揹包,第i種物品最多取ni個 問題2 0 1揹包,本文即將介紹,xi 0或者1,i 1 2 3.n 問題3 多揹包問題,m個揹包,揹包j裝入最大重量bj,j 1 2 3.m,在滿足所有揹包重量約束 條件下使得裝入物品價值最大 問題4 二維揹包,每件物品有wi和體...