注意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];