01背包进阶 二维数组/滚动数组 模/滚动数组 异或/一维数组
枚举所有物品能想到,但编写就很困难了。故需寻求01背包固定算法
1.二维数组写法
#include <stdio.h>
int f[35][210],w[35],c[35];
int max(int a,int b){
return a>b?a:b;
}
int main(){
int M,N,i,j;
scanf("%d%d",&M,&N);
for(i=1;i<=N;i++)scanf("%d%d",&w[i],&c[i]);
for(i=1;i<=N;i++)
for(j=0;j<=M;j++){
f[i][j]=f[i-1][j];
if(j>=w[i])f[i][j]=max(f[i][j],f[i-1][j-w[i]]+c[i]);
}
printf("%d\n",f[N][M]);
return 0;
}
2.1滚动数组写法一 模
#include <stdio.h>
#include <string.h>
int w[35],c[35],f[2][210];
int max(int a,int b){
return a>b?a:b;
}
int