二维:
for(int i=1;i<n;i++){
for(int j=0;j<m;j++){
dp[i][j]=dp[i-1][j];
if(j>=weight[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
}
}
}
一维滚动:
for(int i=1;i<n;i++){
for(int j=m-1;j>=weight[i];j++){
dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);
}
}
重点在于状态的保留,i++之后有dp数组开始未进行变化,所以其相当于还是上一层的值,利用倒序遍历,不会计算时破坏需要的前面的值 这样就可以实现一维数组的滚动。