Problem:
Score : 600 points

Problem Statement

You are given N integers. The i-th integer is a_i.
Find the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the following condition is satisfied:

Let R, G and B be the sums of the integers painted red, green and blue, respectively. There exists a triangle with positive area whose sides have lengths R, G and B.

Constraints

3 \leq N \leq 300

1 \leq a_i \leq 300(1\leq i\leq N)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
a_1
:
a_N

Output

Print the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the condition is satisfied.

Sample Input 1

4
1
1
1
2

Sample Output 1

18

We can only paint the integers so that the lengths of the sides of the triangle will be 1, 2 and 2, and there are 18 such ways.

Sample Input 2

6
1
3
2
3
5
2

Sample Output 2

150

Sample Input 3

20
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9
3
2
3
8
4

Sample Output 3

563038556

Solution in Python (2.7.6) (judge verdict: Time Limit Exceeded)

DIV = 998244353

N = input()
a = []
for i in range(N):
    a.append(input())
a.sort()
suma = sum(a)
dp = [[0] * (suma+1) for i in range(N)]
dp2 = [[0] * (suma+1) for i in range(N)]
dp[0][0] = 2
dp[0][a[0]] = 1
dp2[0][0] = 1
dp2[0][a[0]] = 1 
allc = 3
flag = 0
if(suma%2 == 0):
	flag = 1
for i in range(1,N/2+1):
	allc = allc*9
	if(i*2 >= N):
		allc = allc/3
		k = a[i*2-1]
		for j in range(suma+1):
			if(j < k):
				dp[i][j] = dp[i-1][j]*2
				dp2[i][j] = dp2[i-1][j]
			else:
				dp[i][j] = dp[i-1][j]*2+dp[i-1][j-k]
				dp2[i][j] = dp2[i-1][j]+dp2[i-1][j-k]
	else:
		k = a[i*2-1]
		l = a[i*2]
		if(k<l):
			k,l = l,k
		for j in range(sum(a[:i*2+1])+1):
			if(j < l):
				dp[i][j] = dp[i-1][j]*4
				if(flag == 1):
					dp2[i][j] = dp2[i-1][j]
			elif(j < k):
				dp[i][j] = dp[i-1][j]*4 + dp[i-1][j-l]*2
				if(flag == 1):
					dp2[i][j] = dp2[i-1][j] + dp2[i-1][j-l]
			elif(j < k+l):
				dp[i][j] = dp[i-1][j]*4 + dp[i-1][j-l]*2 + dp[i-1][j-k]*2
				if(flag == 1):
					dp2[i][j] = dp2[i-1][j] + dp2[i-1][j-l] + dp2[i-1][j-k]
			else:
				dp[i][j] = dp[i-1][j]*4+ dp[i-1][j-l]*2 + dp[i-1][j-k]*2 + dp[i-1][j-k-l]
				if(flag == 1):
					dp2[i][j] = dp2[i-1][j]+ dp2[i-1][j-l] + dp2[i-1][j-k] + dp2[i-1][j-k-l]
allc = allc - sum(dp[N/2][suma-suma/2:])*3
if(flag == 1):			
	allc += dp2[N/2][suma/2]*3
print(allc%DIV)