#include <bits/stdc++.h>

using namespace std;

#define MOD 998244353

int n, a[330], dp[300*303], d2[300*303], ans = 1, sum;

int expo(int b, int e) {
    if(e == 0) return 1;
    if(e & 1) return 1ll * b * expo(1LL * b * b % MOD, e >> 1) % MOD;
    return expo(1LL * b * b % MOD, e >> 1);
}

int inv_mod(int x) { return expo(x, MOD - 2); }

int main() {
    scanf("%d", &n);

    dp[0] = d2[0] = 1;
    for(int i = 0; i < n; i++) {
        scanf("%d", &a[i]);

        sum += a[i];
        ans = 3LL * ans % MOD;

        for(int v = n * 300; v >= 0; v--) {
            dp[v] = (2LL * dp[v] % MOD + (v >= a[i] ? dp[v - a[i]] : 0)) % MOD;
            d2[v] =       (d2[v] % MOD + (v >= a[i] ? d2[v - a[i]] : 0)) % MOD;
        }
    }

    for(int i = sum; 2*i >= sum; i--)
        ans = (ans - 3LL * dp[i] % MOD + MOD) % MOD;

    if(sum % 2 == 0) ans = (ans + 3LL * d2[sum/2] % MOD) % MOD;

    printf("%d\n", ans);
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
 
#define MOD 998244353
template<typename ty1,typename ty2>
inline int add(ty1 x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x += y; return x < MOD ? x : x - MOD;
}
template<typename ty1,typename ty2>
inline void addto(ty1 &x, ty2 y) {
		  if(y>=MOD)y%=MOD;
		  if(x>=MOD)x%=MOD;
	      x += y; if (x >= MOD) x -= MOD;
}
template<typename ty1,typename ty2>
inline int sub(ty1 x, ty2 y) {
		if(y>=MOD)y%=MOD;
		 if(x>=MOD)x%=MOD;
        x -= y; return x < 0 ? x + MOD : x;
}
template<typename ty1,typename ty2>
inline void subto(ty1 &x, ty2 y) {
	if(y>=MOD)y%=MOD;
	if(x>=MOD)x%=MOD;
    x -= y; if (x < 0) x += MOD;
}
template<typename ty1,typename ty2>
inline int mul(ty1 x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        return 1ll * x * y % MOD;
}
template<typename ty1,typename ty2>
void multo(ty1 &x, ty2 y) {
        if(y>=MOD)y%=MOD;
		if(x>=MOD)x%=MOD;
        x=1ll * x * y % MOD;
}
 
 
long long int ppow(long long int i, long long int j){
		long long int res = 1LL;
		while (j){
			if ((j & 1LL)){
				res *= i;
				if (res >= MOD){
					res %= MOD;
				}
			}
			j >>= 1;
			i *= i;
			if (i >= MOD){
				i %= MOD;
			}
		}
		return res;
	}
class Combination{
	
public:
	vector<long long int> k;
	vector<long long int> r;
	void resize(int N){
		k.resize(N + 2);
		r.resize(N + 2);
		k[0] = 1;
		for (int i = 1; i < N+2; i++){
			k[i] = k[i - 1];
			k[i] *= i;
			if (k[i] >= MOD)k[i] %= MOD;
		}
		long long int al = k[k.size() - 1];
		long long int iv = ppow(k[k.size() - 1],MOD-2);
		r[k.size() - 1] = iv;
		for (int i = (int)(r.size()) - 2; i >= 0; i--){
			r[i] = r[i + 1] * (i + 1);
			if (r[i] >= MOD){
				r[i] %= MOD;
			}
		}
	}
	long long int C(int a, int b){
		if (a < b)return 0;
		long long int up = k[a];
		long long int dw = r[b] * r[a - b];
		dw %= MOD;
		up *= dw;
		up %= MOD;
		return up;
	}
	long long int H(int a, int b){
		return C(a + b - 1, b);
	}
	long long int catalan_number(int n){
		return (C(2 * n, n) + MOD - C(2 * n, n - 1)) % MOD;
	}
};
Combination C;

#define MAX 302

int n;
vector<int> v;

int dp[MAX][MAX*MAX][4];
int im[MAX];


int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		int a;
		scanf("%d",&a);
		v.push_back(a);
	}
	//v[0]<=v[1]<=v[2]
	//v[0]+v[1]>v[2]
	for(int i=0;i<n;i++){
		im[i]+=v[i];
		if(i)im[i]+=im[i-1];
	}
	dp[0][0][0]=1;
	for(int i=0;i<n;i++){
		for(int j=0;j<=300*i;j++){
			for(int k=0;k<4;k++){
				if(dp[i][j][k]==0)continue;
				//choose
				addto(dp[i+1][j+v[i]][k],dp[i][j][k]);
				//discard
				addto(dp[i+1][j][k|1],dp[i][j][k]);
				addto(dp[i+1][j][k|2],dp[i][j][k]);
			}
		}
	}
	int ans=0;
	int overall=0;
	for(int j=(im[n-1]+1)/2;j<=300*n;j++){
		addto(ans,mul(3,dp[n][j][3]));
	}
	for(int j=1;j<=300*n;j++){
		addto(overall,dp[n][j][3]);
	}
	subto(overall,ans);
	printf("%d\n",overall);
	return 0;
}
