#include<bits/stdc++.h>
#define fast {ios_base::sync_with_stdio(false);cin.tie(NULL);}
#define all(x) (x).begin(), (x).end()
#define Unique(a)       a.erase(unique(all(a)), a.end())
#define ld long double
#define pb push_back
#define fi first
#define se second
#define inf 1e9
using namespace std;    
typedef long long int ll;

const int mxn=2e5+5,mod=1e9+7;

int main(void){
    fast;
    int n;
    cin>>n;
    int t[n],sum=0;
    for(int i=0;i<n;i++){
        cin>>t[i];
        sum+=t[i];
    }
    int dp[sum+1]={0};
    dp[0]=1;
    for(int i=0;i<n;i++){
        for(int j=sum-t[i];j>=0;j--){
            if(dp[j]){
                dp[j+t[i]]=1;
            }            
        }
    }
    int i,ans=sum;
    for(i=1;i<=sum;i++){
        if(dp[i]==1)
            ans=min(ans,max(i,sum-i));
    }    
    cout<<ans;
}

#include <bits/stdc++.h> 
using namespace std; 
#define vll vector<long long>
#define mll map<long long,long long>
#define pll pair<long long,long long>
#define pb push_back
#define F first
#define S second
#define all(v) v.begin(),v.end()
#define FAST  ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define mod 998244353 
typedef  long long ll;
typedef long double ld;
long double pi=3.14159265358979323846;

vll al[300005];
ll I[101][101];

ll gcd(ll a,ll b)
{
    if (b==0) return a;
    return gcd(b,a%b);
}

bool isPrime(int n)
{
    if (n<=1) return false; 
    if (n<=3) return true; 
    if (n%2==0||n%3==0) return false; 
    for (int i=5;i*i<=n;i=i+6) if (n%i==0||n%(i+2)==0) return false; 
    return true; 
}


ll bpow(ll n, ll po)
{
	ll res=1;
	while(po>0)
	{
		if(po%2)
		{
			res=(res*n)%mod;
			po--;
		}
		else
		{
			n=(n*n)%mod;
			po/=2;
		}
	}
	return res;
}

void swap(ll *a, ll *b)
{
	ll temp=*a;
	*a=*b;
	*b=temp;
}

ll fact(ll n) { 
   if ((n==0)||(n==1))
      return 1;
   else
      return n*fact(n-1);
}

ll modInverse(ll n,ll p)
{
	return bpow(n,p-2);
}

ll fac[300001];

ll nCr(ll n,ll r) 
{ 
    if (r == 0) return 1; 
    return (fac[n] * modInverse(fac[r], mod) % mod * modInverse(fac[n - r], mod) % mod) % mod; 
} 

//bool bipartite_dfs(ll node, ll flag)
//{
//	vis[node]=1;
//	ll cflag=flag;
//	color[node]=cflag;
//	for(ll child : al[node])
//	{
//		if(!vis[child])
//		{
//			bool n=bipartite_dfs(child,1-cflag);
//			if(n==false) return false;
//		}
//		else if(color[child]==color[node]) return false;
//	}
//	return true;
//}

void mmul(ll A[][101], ll B[][101], ll dim)
{
	ll res[dim][dim];
	for(ll i=0;i<dim;i++) for(ll j=0;j<dim;j++)
	{
		res[i][j]=0;
		for(ll k=0;k<dim;k++) res[i][j]=(res[i][j]+A[i][k]*B[k][j])%1000000007;
	}
	for(ll i=0;i<dim;i++) for(ll j=0;j<dim;j++) A[i][j]=res[i][j];
}

void mpow(ll A[][101],ll dim, ll po)
{
	for(ll i=0;i<dim;i++) for(ll j=0;j<dim;j++)
	{
		if(i==j) I[i][j]=1;
		else I[i][j]=0;
	}
	while(po>0)
	{
		if(po%2==1)
		{
			mmul(I,A,dim);
			po--;
		}
		else
		{
			mmul(A,A,dim);
			po/=2;
		}
	}
	for(ll i=0;i<dim;i++) for(ll j=0;j<dim;j++) A[i][j]=I[i][j];
}



int main()
{
	FAST
//	freopen("d.txt","r",stdin);
//    freopen("outputd.txt","w",stdout);
	ll testcases=1;
//	cin>>testcases;
//	fac[0]=1;
//	for(ll i=1;i<300001;i++) fac[i]=(fac[i-1]*i)%mod;
	while(testcases--)
	{
		ll n;
		cin>>n;
		ll a[n];
		for(ll i=0;i<n;i++) cin>>a[i];
		sort(a,a+n);
		ll sum=0,ans=0;
		for(ll i=0;i<n;i++) sum+=a[i];
		ll dp[n+1][sum/2+1];
		memset(dp,0,sizeof(dp));
		dp[0][0]=1;
		for(ll i=1;i<=n;i++)
		{
			for(ll j=0;j<=sum/2;j++)
			{
				if(j<a[i-1]) dp[i][j]=dp[i-1][j];
				else dp[i][j]=max(dp[i-1][j-a[i-1]],dp[i-1][j]);
			}
		}
//		for(ll i=0;i<=n)
		for(ll i=sum/2;i>=0;i--)
		{
			if(dp[n][i]==1)
			{
				ans=sum-i;
				break;
			}
		}
		cout<<ans;
	}
}

