/** Solution for Season 6 Round 4 Problem 3 Senior */ #include #include using namespace std; const int MAX_N = 200, MAX_number = 100; int N; int arr[MAX_N]; int dp[MAX_number * MAX_N / 2 + 1][MAX_N]; bool Prev[MAX_number * MAX_N / 2 + 1][MAX_N]; bool used[MAX_number]; int sum; void read() { scanf("%d", &N); for(int i = 0; i < N; i++) { scanf("%d", &arr[i]); sum += arr[i]; } } short compute(int currentSum, int pos) { if(!currentSum) return 2; if(pos == -1) return 1; if(dp[currentSum][pos]) return dp[currentSum][pos]; int opt1, opt2; if(compute(currentSum,pos - 1) == 2) { dp[currentSum][pos] = 2; Prev[currentSum][pos] = 1; } else if(currentSum >= arr[pos] && compute(currentSum - arr[pos], pos - 1) == 2) { dp[currentSum][pos] = 2; Prev[currentSum][pos] = 0; /// redundant, but clarifying } else dp[currentSum][pos] = 1; return dp[currentSum][pos]; } void print(int targetSum) { int index = N - 1; vector group1, group2; printf("%d ", targetSum * (sum - targetSum)); while(targetSum) { if(!Prev[targetSum][index]) { group1.push_back(arr[index]); targetSum -= arr[index]; used[index] = 1; } index--; } for(int i = 0; i < N; i++) if(!used[i]) group2.push_back(arr[i]); printf("%d %d\n", group1.size(), group2.size()); for(int i = 0; i < group1.size(); i++) { printf("%d", group1[i]); if(i == group1.size() - 1) printf("\n"); else printf(" "); } for(int i = 0; i < group2.size(); i++) { printf("%d", group2[i]); if(i == group2.size() - 1) printf("\n"); else printf(" "); } } int main() { freopen("product.in", "r", stdin); freopen("product.out", "w", stdout); read(); for(int i = sum / 2; i >= 1; i--) if(compute(i, N - 1) == 2) { print(i); break; } }