1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <iostream> #include <cstring> #include <algorithm>
using namespace std;
const int N = 110, M = 10010; int f[N][M]; int a[N]; int n, m;
int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; m += a[i]; }
memset(f, -0x3f, sizeof(f)); f[0][0] = 0;
for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { f[i][j] = f[i - 1][j];
if (j >= a[i]) f[i][j] = max(f[i][j], f[i - 1][j - a[i]] + a[i]); else f[i][j] = max(f[i][j], f[i - 1][a[i] - j] + j);
f[i][j] = max(f[i][j], f[i - 1][j + a[i]]); } }
if(f[n][0] <= 0) cout << 0 << endl; else cout << f[n][0] << endl;
return 0; }
|