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][ j ]= max ( dp [ i ][ j ] , dp [ i +1][ j - w [ i ]]+ v [ i ]);
cout << dp[n][w] << endl;
降维
int dp [ MAXN ];
for (int i =0; i < n ; i ++)
for (int j = w [ i ]; j <= W ; j ++)
dp [ j ]= max ( dp [ j ] , dp [j - w [ i ]]+ v [ i ]);
cout << dp[w] << endl;
多重
条件:拿的物品数量有一定的限量
for (int i =0; i < n ; i ++){
int num = m [ i ];
for (int k =1; num >0; k < <=1){
int mul = min (k , num );
for (int j = W ;j >= w [ i ]* mul ;j - -){
dp [ j ]= max ( dp [ j ] , dp [j - w [ i ]* mul ]+ v [ i ]* mul );
}
num -= mul ;
}
}
cout << dp[w] << endl;
模板来源:各种背包模板_wait-优快云博客