此部分代码大都是伪码;
01 背包
//01 背包
void z_o_bag(int n, int m, int w[], int v[]){
int DP[n + 1][m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
DP[i][j] = DP[i - 1][j];
if(j >= v[i]){
DP[i][j] = max(DP[i][j], DP[i - 1][j - v[i]] + w[i]);
}
}
}
}
//01 背包状态压缩
void z_o_bag_plus(int n, int m, int w[], int v[]){
int DP[m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
DP[j] = max(DP[j], DP[j - v[i]] + w[i]);
}
}
}
完全背包
//完全背包
void CompleteBag(int n, int m, int w[], int v[]){
int DP[n + 1][m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
for(int k = 0; k * v[i] <= j; k++){
DP[i][j] = max(DP[i][j], DP[i - 1][j - v[i] * k] + w[i] * k);
}
}
}
}
//完全背包减项优化
void CompleteBag(int n, int m, int w[], int v[]){
int DP[n + 1][m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
DP[i][j] = DP[i - 1][j];
if(j >= v[i]){
DP[i][j] = max(DP[i][j], DP[i][j - v[i]] + w[i]);
}
}
}
}
//完全背包状态压缩
void CompleteBag(int n, int m, int w[], int v[]){
int DP[m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = v[i]; j <= m; j++){
DP[j] = max(DP[j], DP[j - v[i]] + w[i]);
}
}
}
多重背包
//多重背包
void MultipleBag(int n, int m, int w[], int v[], int s[]){
int DP[n + 1][m + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = 0; j <= m; j++){
for(int k = 0; k <= s[i] && k * v[i] <= j; k++){
DP[i][j] = max(DP[i][j], DP[i - 1][j - v[i] * k] + w[i] * k);
}
}
}
}
//多重背包二进制优化
void MultipleBag(int n, int m, int w[], int v[], int s[]){
int ww[10 * n], vv[10 * n];
int cnt = 0;
for(int i = 1; i <= n; i++){
int k = 1;
while(k <= s[i]){
cnt++;
vv[cnt] = v[i] * k;
ww[cnt] = w[i] * k;
s[i] -= k;
k *= 2;
}
if(s[i] > 0){
cnt++;
vv[cnt] = v[i] * s[i];
ww[cnt] = w[i] * s[i];
}
}
n = cnt;
int DP[cnt + 1];
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
DP[j] = max(DP[j], DP[j - vv[i]] + ww[i]);
}
}
}




