题解 | 采药
#include <bits/stdc++.h> #include <cstring> using namespace std; int main() { int m, n; while (cin >> m >> n) { int dp[n + 1][m + 1]; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { int x, y; cin >> x >> y; for (int j = 0; j <= m; j++) { if (x > j)dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - x] + y); } } cout << dp[n][m] << endl; } }
非常经典的01背包问题,这个问题我们已经在专栏里进行了彻底的拆解和分享