目录
一、问题描述
原题链接:背包问题
二、代码求解
2.1 第一种解法
有两种方法,第一种使用二维数组来储存
二维背包问题的求解算法
f[i][j] 表示只看前i个物品,总体积为j的情况下,总价值最大是多少
result=max(f[n][0 ~ v)
f[i][j]:
1.不选第 i 个物品,f[i][j]=f[i-1][j];
2. 选第 i 个物品,f[i][j]=f[i-1][j-v[i]]+w[i];
f[i][j]=max(1,2) ;
f[0][0] = 0 ;
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
// 全局变量的默认值为0
int n, m; // 分别表示物品的数量与背包的最大体积
int f[N][N]; // 只看前i个物品,总体积为j的情况下,总价值最大是多少
int v[N], w[N]; // 每件物品的体积与价值
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> v[i] >> w[i];
for (int i = 1; i <= n; i++)
for (int j = 0; j <= m; j++) {
f[i][j] = f[i - 1][j]; // 不选择第i件物品的情况
if (j >= v[i]) // 体积允许,选择第i件物品
f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
//int res = 0;
//for (int i = 0; i <= m; i++)
// res = max(res, f[n][i]);
//cout << res << endl;
cout << f[n][m] << endl; // 优化代码,直接求最大的体积
return 0;
}
2.2 第二种解法
第二种方法,对上面的代码进行优化,使用一维数组来储存
/* 使用一维数组优化代码 */
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
int n, m; // 分别表示物品的数量与背包的最大体积
int f[N];
int v[N], w[N]; // 每件物品的体积与价值
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
for (int i = 1; i <= n; i++)
for (int j = m; j >= v[i]; j--) {
if (j >= v[i]) // 体积允许,选择第i件物品
f[j] = max(f[j], f[j - v[i]] + w[i]);
}
cout << f[m] << endl;
return 0;
}