典型的01背包问题 前面说过了
但是有超内存的情况 所以换成了只涉及价值的一位数组
哎呀
#include <iostream>
using namespace std;
int N, M;
int w[3500], v[3500];
//int dp[3500][12900];
int bag[12900];
int main(int argc, const char * argv[]) {
int i, j, k;
scanf("%d%d", &N, &M);
memset(bag, 0, sizeof(bag));
for( i = 1; i <= N; i ++){
scanf("%d%d", &w[i], &v[i]);
}
/*for( i = 1; i <= N; i ++){
for( j = 1; j <= M; j ++){
if(w[i] > j){
dp[i][j] = dp[i - 1][j];
}
else{
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
}*/
for( i = 1; i <= N; i ++){
for(k = M; k >= w[i]; k --){
if( bag[k-w[i]]+ v[i] > bag[k] )
bag[k] = bag[k-w[i]]+ v[i];
}
}
printf("%d", bag[M]);
return 0;
}