/* ID: espr1t TASK: KEYWORDS: */ #include #include #include #include #include using namespace std; FILE *in; FILE *out; const int MAX = 202; const int MM = 202 * 100; int n; int a[MAX]; int dyn[MAX][MM]; int nxt[MAX][MM]; int recurse(int idx, int sum1, int sum2) { if (idx >= n) return sum1 * sum2; if (dyn[idx][sum1] != -1) return dyn[idx][sum1]; int ans = 0, wth = -1, cur; // Add to the first sum cur = recurse(idx + 1, sum1 + a[idx], sum2); if (ans < cur) ans = cur, wth = 0; // Add to the second sum cur = recurse(idx + 1, sum1, sum2 + a[idx]); if (ans < cur) ans = cur, wth = 1; nxt[idx][sum1] = wth; return dyn[idx][sum1] = ans; } int main(void) { in = stdin; out = stdout; in = fopen("product.in", "rt"); out = fopen("product.out", "wt"); fscanf(in, "%d", &n); for (int i = 0; i < n; i++) fscanf(in, "%d", &a[i]); memset(dyn, -1, sizeof(dyn)); int ans = recurse(0, 0, 0); vector g1, g2; int idx = 0, sum1 = 0, sum2 = 0; while (idx < n) { if (nxt[idx][sum1] == 0) g1.push_back(a[idx]), sum1 += a[idx]; else g2.push_back(a[idx]), sum2 += a[idx]; idx++; } fprintf(out, "%d %d %d\n", ans, (int)g1.size(), (int)g2.size()); for (int i = 0; i < (int)g1.size(); i++) fprintf(out, "%d%c", g1[i], i + 1 == (int)g1.size() ? '\n' : ' '); for (int i = 0; i < (int)g2.size(); i++) fprintf(out, "%d%c", g2[i], i + 1 == (int)g2.size() ? '\n' : ' '); return 0; }