文章目录 1:题目2:代码实现1.二维朴素写法:2. 1:题目 2:代码实现 1.二维朴素写法: #include<iostream> using namespace std; const int N = 1010; int n, m; int v[N], w[N]; int f[N][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 ++ ){ // 01背包 二维 正序/逆序 更新 都可以,完全背包 二维 只能 正序更新 // for (int j = m; j >= 0; j -- ){ // 01背包 逆序 更新 也可以 if (j < v[i]) f[i][j] = f[i - 1][j]; else f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]); // 完全背包:f[i][j] = max(f[i - 1][j], f[i][j - v[i]] + w[i]); } cout << f[n][m] << endl; return 0; } 2. // 01背包:一维空间优化写法, 将 以上代码 最终简写为如下: // 注意 for (int j = m; j >= v[i]; j -- ) 中 j >= v[i],简化之前 j >= 0 #include<iostream> using namespace std; const int N = 1010; int n, m; int v[N], w[N]; int f[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 -- ) // 01背包 一维写法 只能 逆序更新 // 完全背包 一维写法 只能 正序更新:for (int j = v[i]; j <= m; j ++ ) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m] << endl; return 0; }