#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
const int N = 1010; // 定义最大物品数量和背包容量的常量
int n, m; // n 表示物品数量,m 表示背包容量
int a[N], b[N]; // a[i] 表示第 i 个物品的体积,b[i] 表示第 i 个物品的价值
int f[N][N]; // 动态规划表,f[i][j] 表示前 i 个物品在容量为 j 的背包中的最大价值
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 加速输入输出
cin >> n >> m; // 输入物品数量和背包容量
// 输入每个物品的体积和价值
for (int i = 1; i <= n; i++)
cin >> a[i] >> b[i];
// 动态规划核心部分
for (int i = 1; i <= n; i++) // 遍历每个物品
for (int j = 0; j <= m; j++) // 遍历背包的每个可能容量
{
// 状态转移方程:不选第 i 个物品时,最大价值等于前 i-1 个物品在容量 j 下的最大价值
f[i][j] = f[i - 1][j];
// 如果当前背包容量 j 足够放下第 i 个物品
if (j >= a[i])
// 更新最大价值:比较不选和选第 i 个物品的情况,取较大值
f[i][j] = max(f[i][j], f[i - 1][j - a[i]] + b[i]);
}
// 输出最终结果:前 n 个物品在容量 m 下的最大价值
cout << f[n][m] << endl;
return 0;
}
0-1 背包问题(C++)
于 2025-03-25 22:08:01 首次发布