一维dp:
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * f;
}
int t, m;
int p[1005], v[150], w[150];
int main() {
t = read(), m = read();
for (int i = 0; i < m; ++i) {
w[i] = read(), v[i] = read();
}
for (int i = 0; i < m; ++i) {
for (int j = t; j >= w[i]; --j) {
p[j] = max(p[j], p[j - w[i]] + v[i]);
}
}
cout << p[t] << endl;
return 0;
}
二维dp:
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * f;
}
int t, m;
int p[1005][1005], v[150], w[150]; //一维表示用了前几个,二维表示重量
int main() {
t = read(), m = read();
for (int i = 1; i <= m; ++i) {
w[i] = read(), v[i] = read();
}
for (int i = 1; i <= m; ++i) {
for (int j = 0; j <= t; ++j) {
if (j < w[i]) {
p[i][j] = p[i - 1][j];
} else {
p[i][j] = max(p[i-1][j], p[i - 1][j - w[i]] + v[i]);
}
}
}
cout << p[m][t] << endl;
return 0;
}