#include <bits/stdc++.h>
 
// headers {{{
using namespace std;
// using namespace rel_ops;
 
typedef long long int64;
typedef unsigned long long uint64;
const double pi=acos(-1.0);
const double eps=1e-11;
const int INF=0x7FFFFFFF;
template<class T> inline bool checkmin(T &a,T b){return b<a?a=b,1:0;}
template<class T> inline bool checkmax(T &a,T b){return b>a?a=b,1:0;}
template<class T> inline T sqr(T x){return x*x;}
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VII;
#define MP(A,B) make_pair(A,B)
#define PB(X) push_back(X)
#define mem(a,b) memset(a, b, sizeof(a))
#define clr(a) memset(a, 0, sizeof(a))
#define rep(i,n) for(int i=0; i<(int)n; i++)
#define ff first
#define ss second
#ifdef LOCAL
#define dbg(args...) printf(args); //##__VA_ARGS__
#define dout cout
#define out(x) (cout<<#x<<": "<<x<<endl)
template<class T>void show(T a, int n){for(int i=0; i<n; ++i) cout<<a[i]<<' '; cout<<endl;}
template<class T>void show(T a, int r, int l){for(int i=0; i<r; ++i)show(a[i],l);cout<<endl;}
#else
#define dbg(...)
#define dout if(true);else cout
#define out(...)
#define show(...)
#endif
// }}}

template<typename T, typename I> T qpow(T base, I t) {
    T ret(1);
    while (t) {
        if (t&1) ret *= base;
        base = base * base;
        t >>= 1;
    }
    return ret;
}
template <int m, typename intbase = int>
struct ModInt {
    intbase r;
    ModInt() : r(0) {}
    ModInt(int64 rr) : r(rr) {
        if (abs(r) >= m) r %= m;
        if (r < 0) r += m;
    }
    ModInt(int rr) : r(rr) {
        if (abs(r) >= m) r %= m;
        if (r < 0) r += m;
    }
    ModInt inv() const { return qpow(*this, m - 2); }
    ModInt operator*(const ModInt &t) const { return (int64(r) * t.r) % m; }
    ModInt operator/(const ModInt &t) const { return *this * t.inv(); }
    ModInt operator+=(const ModInt &t) {
        r += t.r;
        if (r >= m) r -= m;
        return *this;
    }
    ModInt operator-=(const ModInt &t) {
        r -= t.r;
        if (r < 0) r += m;
        return *this;
    }
    friend std::ostream& operator<<(std::ostream& os, ModInt x) {
        return os << x.r;
    }
    ModInt operator+(const ModInt &t) const { return ModInt(*this) += t; }
    ModInt operator-(const ModInt &t) const { return ModInt(*this) -= t; }
    ModInt operator*=(const ModInt &t) { return *this = *this * t; }
    ModInt operator/=(const ModInt &t) { return *this = *this / t; }

    bool operator==(const ModInt &t) const { return r == t.r; }
    bool operator!=(const ModInt &t) const { return r != t.r; }

    operator int64() const { return r; }
};
using Int = ModInt<998244353>;

template<typename T=Int>
struct NChooseR {
    vector<T> perm;
    NChooseR(int N=1e5) : perm(N+1) {
        perm[0] = 1;
        for (int i = 1; i <= N; i++) perm[i] = perm[i-1] * T(i);
    }
    T operator()(int n, int r) {
        return perm[n] / perm[r] / perm[n-r];
    }
};
int h[3001];
Int dp[3001];
int main() {
    int N, S;
    Int inv2 = Int(2).inv();
    while (cin >> N >> S) {
        rep(i, N) cin >> h[i];
        memset(dp, 0, sizeof(dp));
        dp[0] = qpow(Int(2), N);
        rep(i, N) {
            for (int s = S; s >= h[i]; s--) {
                dp[s] += dp[s-h[i]] * inv2;
            }
            show(dp, S+1);
            // for (int s = 0; s + h[i] <= S; s++) {
                // dp[i+1][s+h[i]] += dp[i][s] * inv2;
            // }
        }
        cout << dp[S] << endl;
    }
    return 0;
}



Measured memory_bytes: 3660