int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); 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]; if (j >= v[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; return 0; }
直接输出结果最大为f[n][m]
因为在 j 的循环中,j 是从 m 开始递减到 v[i]。所以,将最大价值记录在 f[n][m] 中即可。当背包容量为 m 时,已经遍历了所有的物品,得到了所有的状态,因此此时 f[n][m] 就是背包在容量为 m 时的最大价值。
#include <bits/stdc++.h> using namespace std; const int N = 10010; int n, m; int f[N]; int v[N], w[N]; int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); 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 --) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0; }
int main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); 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 = v[i]; j <= m; j ++) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0; }
int main(){ cin >> n >> m; for (int i = 1; i <= n; i ++ ){ int v, w, s; cin >> v >> w >> s; int k = 1; //二进制优化 while(k <= s){ for(int j = m; j >= v * k; j --){ f[j] = max(f[j], f[j-v * k] + w * k); }