#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <iomanip>
#include <utility>
#include <tuple>
#include <functional>
#include <bitset>
#include <cassert>
#include <time.h>
#define int long long
#define endl '\n'
#define INF 1000000000000000000
#define EPS 1e-10
#define all(a) a.begin(),a.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define fi first
#define se second
#define pb push_back
#define double long double
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<ll, P> PP;
template<class T, class S> bool chmax(T &a, const S &b) { if (a < b) { a = b; return 1; } return 0; }
template<class T, class S> bool chmin(T &a, const S &b) { if (a > b) { a = b; return 1; } return 0; }
ll gcd(ll n, ll m) { return (m ? gcd(m, n%m) : n); }
ll lcm(ll n, ll m) { return n / gcd(n, m)*m; }

ll mod = 1000000007;

signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	cout << fixed << setprecision(20);
	//modcalc();

	int n, w;
	cin >> n >> w;
	vector<int> a(n);
	rep(i, n) cin >> a[i];
	sort(all(a)); //reverse(all(a));
	int sum = 0;
	rep(i, n) sum += a[i];
	if (sum <= w) {
		cout << 1 << endl;
		return 0;
	}
	int ans = 0;
	for (int x = 0; x < n; x++) {
		vector<vector<int>> dp(210, vector<int>(10010));
		dp[0][0] = 1;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <= w; j++) {
				if (i >= x) dp[i + 1][j] += dp[i][j];
				if (j >= a[i] && i != x) {
					dp[i + 1][j] += dp[i][j - a[i]];
				}
				dp[i + 1][j] %= mod;
			}
		}
		for (int k = max(0LL, w - a[x] + 1); k <= w; k++) {
			ans += dp[n][k]; ans %= mod;
		}
		for (int i = 0; i <= n; i++) {
			for (int j = 0; j <= w; j++) {
				//cout << dp[i][j] << ' ';
			}
			//cout << endl;
		}
		//cout << endl;
	}
	cout << ans << endl;
}

