01
条件 : 每种物品只能拿一件
for (int i =0; i < n ; i ++)
for (int j =0; j <= W ; j ++)
if(j < w [ i ])
dp [ i +1][ j ]= dp [ i ][ j ];
else
dp [ i +1][ j ]= max ( dp [ i ][ j ] , dp [ i ][ j - w [ i ]]+ v [ i ]);
cout << dp[n][w] << endl;
降维写法
int dp [ MAXN ];
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] << endl;
完全
条件 : 可以拿多件相同的物品
for (int i =0; i < n ; i ++)
for (int j =0; j <= W ; j ++)
if(j < w [ i ])
dp [ i +1][ j ]= dp [ i ][ j ];
else
dp [ i +1][