//http://judge.openfmi.net:9280/practice/get_problem_description?contest_id=2&problem_id=4 #include #include int main() { int n; scanf("%d", &n); int *arr = new int [n]; int i, j, sum = 0; for (i = 0; i < n; ++i) { scanf("%d", arr + i); sum += arr[i]; } int target = sum / 2; // curr[s] = can we make a sum = s with current number of elements[0..j] // prev[s] = can we make a sum = s with current number of elements[0..j - 1] bool *prev = new bool[target + 1](); bool *curr = new bool[target + 1]; for (j = 1; j <= n; ++j) { prev[0] = true; for (i = 1; i <= target; ++i) { // we can make the sum if we could previously curr[i] = prev[i]; if (arr[j - 1] <= i) curr[i] ||= prev[i - arr[j - 1]]; // a[0] + a[1] + .. + a[j - 1] == sum <=> a[0] + a[1] + .. + a[j - 2] == sum - a[j - 1] // sum = i // we can make sum = i with elements [1..j-1], if we could make // sum = i - arr[j-1] with elements [1..j-2] (and adding arr[j-1]) } std::swap(prev, curr); } for (i = target; i >= 0; --i) { if (prev[i]) { printf("%d\n", (sum - i) - i); break; } } }