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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef long long int int64;
typedef unsigned long long int uint64;

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))

void run(void){
  int n;
  scanf("%d",&n);
  int *a=(int *)malloc(sizeof(int)*n);
  int i;
  for(i=0;i<n;i++) scanf("%d",a+i);
  int sum=0;
  for(i=0;i<n;i++) sum+=a[i];

  const int b=64;
  const int len=(sum+b-1)/b;
  uint64 *bit=(uint64 *)calloc(len,sizeof(uint64));
  bit[0]=1;
  int localSum=0;
  for(i=0;i<n;i++){
    const int aa=a[i];
    int j;
    for(j=localSum/b;j>=0;j--){
      if(aa%b!=0){
	bit[(b*j+aa)/b+1]|=bit[j]>>(64-aa%b);
      }
      bit[(b*j+aa)/b]|=bit[j]<<(aa%b);
    }
    localSum+=aa;
  }
  int median=sum/2;
  while(((bit[median/b]>>(median%b))&0x01)==0) median++;
  printf("%d\n",median);
}

int main(void){
  run();
  return 0;
}