/*
        _            _                  _            _       _     _         _   _          _          _             _        
       / /\         / /\               / /\         / /\    / /\  /\ \      /\_\/\_\ _     /\ \       /\ \     _    /\ \      
      / /  \       / /  \             / /  \       / / /   / / /  \ \ \    / / / / //\_\   \ \ \     /  \ \   /\_\ /  \ \     
     / / /\ \__   / / /\ \           / / /\ \__   / /_/   / / /   /\ \_\  /\ \/ \ \/ / /   /\ \_\   / /\ \ \_/ / // /\ \_\    
    / / /\ \___\ / / /\ \ \         / / /\ \___\ / /\ \__/ / /   / /\/_/ /  \____\__/ /   / /\/_/  / / /\ \___/ // / /\/_/    
    \ \ \ \/___// / /  \ \ \        \ \ \ \/___// /\ \___\/ /   / / /   / /\/________/   / / /    / / /  \/____// / / ______  
     \ \ \     / / /___/ /\ \        \ \ \     / / /\/___/ /   / / /   / / /\/_// / /   / / /    / / /    / / // / / /\_____\ 
 _    \ \ \   / / /_____/ /\ \   _    \ \ \   / / /   / / /   / / /   / / /    / / /   / / /    / / /    / / // / /  \/____ / 
/_/\__/ / /  / /_________/\ \ \ /_/\__/ / /  / / /   / / /___/ / /__ / / /    / / /___/ / /__  / / /    / / // / /_____/ / /  
\ \/___/ /  / / /_       __\ \_\\ \/___/ /  / / /   / / //\__\/_/___\\/_/    / / //\__\/_/___\/ / /    / / // / /______\/ /   
 \_____\/   \_\___\     /____/_/ \_____\/   \/_/    \/_/ \/_________/        \/_/ \/_________/\/_/     \/_/ \/___________/    
                                                                                                                              
*/
#include<bits/stdc++.h>
using namespace std;
#define ALL(obj) (obj).begin(), (obj).end()
#define REP(i, n) for(int i = 0;i < (n);++i)

#define endl '\n'
#define pb emplace_back
#define mkp make_pair
#define p_q priority_queue
#define INF 1000000000
#define PI 3.1415926
#define coutdb cout << fixed << setprecision(10)

const int dx[]={1,0,-1,0}, dy[]={0,-1,0,1};
const int dx_8[]={1,1,0,-1,-1,-1,0,1}, dy_8[]={0,-1,-1,-1,0,1,1,1};
const long long MOD = 1e9+7;

// typedef long long ll;
#define int long long

template <typename T> inline T GCD(T a,T b){T c;while(b!=0){c=a%b;a=b;b=c;}return a;}
template <typename T> inline T LCM(T a,T b){T c=GCD(a,b);a/=c;return a*b;}
template <typename T> inline T nCr(T a,T b){T i,r=1;for(i=1;i<=b;i++){r*=(a+1-i);r/=i;}return r;}
template <typename T> inline T nHr(T a,T b){return nCr(a+b-1,b);}

bool L[5010][5001], R[5010][5001];
int N, K;

void pre(vector<int>& a){
  REP(i, N+1){
    L[i][0] = 1;
    R[i+1][0] = 1;
  }

  REP(i, N) REP(j, K){
    if(j-a[i] >= 0) L[i+1][j] |= (L[i][j] or L[i][j-a[i]]);
    else L[i+1][j] |= L[i][j];
  }

  for(int i = N+1; i >= 2; i--){
    REP(j, K){
      if(j-a[i-2] >= 0) R[i-1][j] |= (R[i][j] or R[i][j-a[i-2]]);
      else R[i-1][j] |= R[i][j];
      // if(j > 0) R[i-1][j] += R[i-1][j-1];
    }
  }
}

signed main(void){
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> N >> K;
  vector<int> A(N);
  REP(i, N) cin >> A[i];
  sort(ALL(A));

  pre(A);

  int left = -1, right = N;
  while(right - left > 1){
  	int mid = (left+right) / 2;
  	bool necessary = 0;
  	for(int sum = max(0ll, K-A[mid]); sum < K; sum++){
  		REP(i, sum+1){
  			necessary |= (L[mid][i] and R[mid+2][sum-i]);
  		}
  	}
  	cerr << mid << ' ';
  	if(necessary) {
  		right = mid;
  		cerr << "necessary" << endl;
  	}else{
  		left = mid;
  		cerr << "no need" << endl;
  	}
  }
  cout << right << endl;

  return 0;
}


Measured memory_bytes: 49152