for (int i = 1; i <= n; i++)
{
for (int j = v; j >= 0; j--)
{
dp[j] = max(dp[j], dp[j - c[i]] + w[i]);
}
}
在关于二层循环的方向问题上我之前不是很清楚,主要解释一下这里。
第i次求数组的时候,需要的max中的两个元素的值必须是来自第i-1次循环。 如果正向循环的话因为 j - c[i] < j , 所以会先更新较小的j对应的数组 , 在求到较大的j时 dp[j-c[i]] 已经被更新过了,所以在求较大的dp[j]的时候 max中第二元素的值不是来自第i-1次循环而是来自第i次,与原式不符。