下列代码实现了⼀个 0-1 背包的⼀维动态规划代码,内层循环是经典的逆序写法。若将内层循环改成正序遍历(即 for (int j = w[i]; j <= W; j++) ),仍能得到正确答案。
int main () {
int W = 5 ;
int w [] = { 2 , 3 , 4 };
int v [] = { 10 , 1 , 1 };
int n = 3 ;
int dp [ 6 ] = { 0 };
for ( int i = 0 ; i < n ; i ++ ) {
for ( int j = W ; j >= w [ i ]; j -- ) { // ← 逆序!
dp [ j ] = max ( dp [ j ], dp [ j - w [ i ]] + v [ i ]);
}
}
cout << dp [ W ];
}
正确
错误