核心代码 一维滚动数组正向枚举,而01背包必须时逆向枚举。 //物品数量是5 最大容量是 20 void knapsack2(){ for(int i = 1; i <= 5; i++){ for(int c = w[i]; c <= 20; c++){ //注意从自减改成自增,其他不用变 d[c] = max(d[c], d[c - w[i]] + v[i]); } } } 二维转移 dp[i][c] = max(dp[i-1][c], dp[i][c - w[i]] + v[i]);