注意j是从前往后开始遍历的,不可以倒过来遍历。原因如下:
上方图片上二维状态,i表示第几个物品,j表示背包的多剩下的容量。
- ll m, n; cin >> m >> n;
- for (int i = 1; i <= n; ++i) cin >> w[i] >> v[i];
-
- for (int i = 1; i <= n; ++i)
- {
- for (int j = v[i]; j <= m; ++j)
- {
- //区别是从自己转移过来的
- dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
- }
- }
-
- cout << dp[m];