#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pullull;
typedef pair<ll, int> plli;
typedef pair<int, pii> pipii;
typedef vector<vector<int> > mati;
typedef vector<vector<double> > matd;
typedef vector<ll> vll;
typedef vector<vector<ll>> vvll;
typedef vector<vector<vector<ll>>> vvvll;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;
typedef vector<vector<vector<bool>>> vvvb;

#define FOR(i,x,y) for(ll i=(ll)x; i<(ll)y; ++i)
#define REP(i,y) FOR(i, 0, y)
#define RFOR(i,x,y) for(ll i=(ll)x; i>=(ll)y; --i)
#define RREP(i,x) RFOR(i, x, 0)

template <typename T>
void vec_print(vector<T> VEC){
  REP(i, VEC.size()){
    cout << VEC[i] << " ";
  }
  cout << "\n";
};

template <typename T>
void mat_print(vector<vector<T> > MAT){
  REP(i, MAT.size()){
    REP(j, MAT[i].size()){
      cout << MAT[i][j] << " ";
    }
    cout << "\n";
  }
};

template <typename CLASS1, typename CLASS2>
class HOGE{
  public:
    CLASS1 key;
    CLASS2 value;
    HOGE(void){
      return;
    };
    HOGE(CLASS1 key, CLASS2 value){
      this->key = key;
      this->value = value;
    };
    ~HOGE(void){
      return;
    };

    void print(void){
      cout << "key : " << key << ", value : " << value << "\n";
      return;
    };
    
    bool operator==(const HOGE &obj){
      return (this->value == obj.value);
    };
    bool operator<(const HOGE &obj){
      return (this->value < obj.value);
    };
    bool operator>(const HOGE &obj){
      return (this->value > obj.value);
    };
};

template <typename CLASS1, typename CLASS2>
bool operator==(const HOGE<CLASS1, CLASS2> &hoge1, const HOGE<CLASS1, CLASS2> &hoge2){
  return hoge1.value == hoge2.value;
};

template <typename CLASS1, typename CLASS2>
bool operator<(const HOGE<CLASS1, CLASS2> &hoge1, const HOGE<CLASS1, CLASS2> &hoge2){
  return hoge1.value < hoge2.value;
};

template <typename CLASS1, typename CLASS2>
bool operator>(const HOGE<CLASS1, CLASS2> &hoge1, const HOGE<CLASS1, CLASS2> &hoge2){
  return hoge1.value > hoge2.value;
};

constexpr int INF = (1<<30);
constexpr ll INFLL = 1LL<<62;
constexpr long double EPS = 1e-12;
constexpr ll MOD = (ll)((1E+9)+7);

int main(){
  cin.tie(0); // cut the cin and cout (default, std::flush is performed after std::cin)
  ios::sync_with_stdio(false); // cut the iostream and stdio (DON'T endl; BUT "\n";)

  ll N, K;
  cin >> N >> K;
  vll a(N);
  REP(i, N) cin >> a[i];

  vvb Left(N+1, vb(K, false)), Right(N+1, vb(K, false));
  //Left.assign(N+1, vb(K, false));

  Left[0][0] = true;
  REP(i, N){
    for(int j=0; j<K; ++j){
      Left[i+1][j] = (Left[i+1][j] | Left[i][j]);
    }
    for(int j=0; j+a[i]<K; ++j){
      Left[i+1][j+a[i]] = (Left[i+1][j+a[i]] | Left[i][j]);
    }
  }

  //Right.assign(N+1, vb(K, false));
  Right[N][0] = true;

  for(ll i=N-1; i>=0; --i){
    for(int j=0; j<K; ++j){
      Right[i][j] = (Right[i][j] | Right[i+1][j]);
    }
    for(int j=0; j+a[i]<K; ++j){
      Right[i][j+a[i]] = (Right[i][j+a[i]] | Right[i+1][j]);
    }
  }

  /*
  REP(i, N+1){
    cout << i << " Left: ";
    REP(j, K){
      cout << " " << Left[i][j];
    }
    cout << "\n";
    cout << i << " Right: ";
    REP(j, K){
      cout << " " << Right[i][j];
    }
    cout << "\n";
  }
  */

  int ans = 0;

  REP(i, N){
    //without a[i]
    //Left[i] + Right[i+1]
    ll left_i = 0;
    ll right_i = K-1;
    while(!Left[i][left_i]){
      left_i++;
      if(left_i >= K) break;
    }
    while(!Right[i+1][right_i]){
      right_i--;
      if(right_i < 0) break;
    }
    if(left_i>=K || right_i<0){
      ans++;
      continue;
    }

    ll max_sum = min(left_i + right_i, K);

    while(right_i<K && right_i>=0){
      if(left_i + right_i >= K){
        right_i--;
        while(!Right[i+1][right_i]){
          right_i--;
          if(right_i < 0) break;
        }
      }else{
        left_i++;
        while(!Left[i][left_i]){
          left_i++;
          if(left_i >= K) break;
        }
      }
      if(left_i >= K || right_i<0){
        break;
      }

      if(max_sum >= K) max_sum = min(left_i + right_i, K);
      else if(left_i + right_i < K) max_sum = max(max_sum, left_i + right_i);
    }

    //cout << i << ":" << max_sum << "\n";
    if(max_sum + a[i] < K) ans++;
  }

  cout << ans << "\n";

  return 0;
}

Measured memory_bytes: 8960