例题链接

题目描述:

有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。

第 ii 件物品的体积是 vi,价值是 wi 。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式:

第一行两个整数,N,VN,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 NN 行,每行两个整数 vi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。

输出格式:

输出一个整数,表示最大价值。

数据范围:

0<N,V≤10000
0<vi,wi≤1000

输入样例:

1
2
3
4
5
4 5
1 2
2 4
3 4
4 5

输出样例:

1
8

思路:(动态规划+一维数组)

在题目里描述里我们知道每个背包都有两种属性:体积+价值

所以第一步我写了一个结构体方便对背包进行管理

核心代码:

1
2
3
for (int i = 1; i <= N; i++)
for (int j = V; j >= pack.num[i]; j--)
F[j] = max(F[j], F[j - pack.num[i]] + pack.vlaue[i]);

在枚举的过程中max已经将F[V]的值更新为价值最大且满足体积要求的背包价值

所以完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 1005;
struct Package
{
int num[M];
int vlaue[M];
};
int main()
{
Package pack;
int F[M];
int N, V;
cin >> N >> V;
for (int i = 1; i <= N; i++)
cin >> pack.num[i] >> pack.vlaue[i];
for (int i = 1; i <= N; i++)
for (int j = V; j >= pack.num[i]; j--)
F[j] = max(F[j], F[j - pack.num[i]] + pack.vlaue[i]);
int res = 0;
res = F[V];
cout << res << endl;
return 0;
}