#include <iostream>
using namespace std;

int v[21];

int judge(int index,int remain){
    if(remain == 0) return 1; //成功
    if(index <= 0) return 0; //下標無效,捨棄
    return judge(index-1,remain) + judge(index-1, remain - v[index]);
    /*
    從第n個物品往前取。試探性取第index個物品,如果不行會返回0.
    取了第index個物品後,如果剩餘體積remain仍然大於0,代表沒有取淨,還可以繼續取,這個時候再試試取第index-1個物品也就是前一個物品。
    如果等於0,代表取淨,本次算法結束,次數+1。
    */
}

int main() {
    int n ,i;
    cin >> n;

    for(i = 1; i <= n ; i ++ ){
        cin >> v[i];
    } //物品從下標1開始存放於v[]

    cout << judge(n, 40) << endl;

    return 0;
}