(文中所有解释并不是官方解释,仅是易于自己理解对自己以后复习方便的解释)
原题链接:2. 01背包问题 - AcWing题库
最简单的背包问题,ac代码(含非官方解释):
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int dp[N];
int w[N], v[N];
int n, m;
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--) {//从m开始保证不会在遍历时对本层已遍历数据再次利用,导致同一个数据多次使用
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
}
}
cout << dp[m] << endl;/*至于答案为社么在dp[m]上,由于一共就m个数据每回合都会调用这些数据中的某些并取最大值,
同时对于第一层调用dp数组为全局变量数组中都会赋值为0,在第一次调用时不会产生其他数据出现,所以dp[m]也是答案所在*/
return 0;
}