滚动数组:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[13000];
int w, v;
int main() {
freopen("input.txt", "r", stdin);
int n, m;
while(~scanf("%d%d", &n, &m)) {
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++) {
scanf("%d%d", &w, &v);
for(int j = m; j >= 0; j--) {
if (j >= w) dp[j] = max(dp[j], dp[j-w]+v);
}
}
printf("%d\n", dp[m]);
}
return 0;
}
滚动数组方法让我想到了斐波那契数列的迭代写法:
v[0] = 1;
v[1] = 2;
for(int i = 2; i <= n; i++)
{
v[i] = v[0] + v[1];
}