Problem:
Score : 700 points

Problem Statement

You are given N integers A_1, A_2, ..., A_N.

Consider the sums of all non-empty subsequences of A. There are 2^N - 1 such sums, an odd number.

Let the list of these sums in non-decreasing order be S_1, S_2, ..., S_{2^N - 1}.

Find the median of this list, S_{2^{N-1}}.

Constraints

1 \leq N \leq 2000

1 \leq A_i \leq 2000

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the median of the sorted list of the sums of all non-empty subsequences of A.

Sample Input 1

3
1 2 1

Sample Output 1

2

In this case, S = (1, 1, 2, 2, 3, 3, 4). Its median is S_4 = 2.

Sample Input 2

1
58

Sample Output 2

58

In this case, S = (58).

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

//In The Name of Beauty
//...So here I go is my shot
//Feet fail me not 'cause maybe the only opportunity that I got...
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
typedef vector<ll> vll;
#define IB std::ios::sync_with_stdio(0);
#define pb(x) push_back(x);
#define mp(x,y) make_pair(x,y)
#define pll pair<ll,ll>
#define F first
#define S second
ll const MAXN = 4e5 + 8;
ll const delta = 1000000007;
bool dp[MAXN][2];
ll a[MAXN];
int main()
{
    IB;
    cin.tie(0);
    cout.tie(0);
    ll n;
    cin >> n;
    ll sum = 0;
    for(ll i = 0;i < n;i++)
    {
        cin >> a[i];
        sum += a[i];
    }
    sort(a,a + n);
    dp[0][1] = 1;
    for(ll i = 0;i < n;i++)
    {
        for(ll j = 0;j < MAXN;j++)
        {
            dp[j][0] = dp[j][1];
            dp[j][1] = 0;
        }
        for(ll j = 0;j < MAXN;j++)
        {
            if(a[i] <= j)
            {
                if(j + a[i] < MAXN)dp[j + a[i]][1] |= dp[j][0];
                if(j >= a[i])dp[j - a[i]][1] |= dp[j][0];
            }
            else
            {
                if(j + a[i] < MAXN)dp[j + a[i]][1] |= dp[j][0];
                if(a[i] - j >= 0)dp[a[i] - j][1] |= dp[j][0];
            }
        }
    }
    ll ans = MAXN - 1;
    for(ll j = 0;j < MAXN;j++)
    {
        if(dp[j][1])
        {
            ans = j;
            break;
        }
    }
    cout << (sum + ans) / 2;
    return 0;
}
//Written by M_H_H_7