第一講 01揹包問題

2022-09-09 13:54:22 字數 1532 閱讀 2575

有 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 #include2

3using

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 #include2

3using

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