import
java.util.*;
import
java.io.*;
class
GFG{
public
static
Boolean canSplit[] =
new
Boolean[
1
<<
20
];
public
static
TreeMap<Integer, Integer> mp =
new
TreeMap<Integer, Integer>();
public
static
ArrayList<ArrayList<Integer>> subsets =
new
ArrayList<ArrayList<Integer>>();
public
static
int
ID;
public
static
void
makeSubsets1(
int
i,
int
N,
int
sum,
int
mask,
int
Arr[])
{
if
(i == N) {
if
(!mp.containsKey(sum)) {
++ID;
mp.put(sum, ID);
}
int
id = mp.get(sum);
subsets.get(id).add(mask);
return
;
}
makeSubsets1(i +
1
, N, sum, mask, Arr);
makeSubsets1(i +
1
, N, sum + Arr[i], mask | (
1
<< i), Arr);
makeSubsets1(i +
1
, N, sum - Arr[i], mask | (
1
<< i), Arr);
}
public
static
void
makeSubsets2(
int
i,
int
N,
int
sum,
int
mask,
int
Arr[])
{
if
(i == N) {
if
(mp.containsKey(sum)) {
for
(Integer num : subsets.get(mp.get(sum))) {
canSplit[num | mask] =
true
;
}
}
return
;
}
makeSubsets2(i +
1
, N, sum, mask, Arr);
makeSubsets2(i +
1
, N, sum + Arr[i], mask | (
1
<< i), Arr);
makeSubsets2(i +
1
, N, sum - Arr[i], mask | (
1
<< i), Arr);
}
public
static
int
UtilCountOfSubsets(
int
N,
int
Arr[])
{
int
mid = N /
2
;
makeSubsets1(
0
, mid,
0
,
0
, Arr);
makeSubsets2(mid, N,
0
,
0
, Arr);
int
ans =
0
;
for
(
int
i =
1
; i < (
1
<< N) ; ++i) {
if
(canSplit[i]){
ans++;
}
}
return
ans;
}
public
static
void
main(String args[])
{
int
Arr[] = {
2
,
3
,
4
,
5
};
int
N = Arr.length;
for
(
int
i =
0
; i < (
1
<<
20
) ; i++){
subsets.add(
new
ArrayList<Integer>());
canSplit[i] =
false
;
}
System.out.println(UtilCountOfSubsets(N, Arr));
}
}