import std.algorithm, std.container, std.conv, std.math, std.range, std.typecons, std.stdio, std.string;

auto rdsp(){return readln.splitter;}
void pick(R,T)(ref R r,ref T t){t=r.front.to!T;r.popFront;}
void readV(T...)(ref T t){auto r=rdsp;foreach(ref v;t)pick(r,v);}
void readA(T)(size_t n,ref T[]t){t=new T[](n);auto r=rdsp;foreach(ref v;t)pick(r,v);}

void main()
{
  int n, k; readV(n, k);
  int[] a; readA(n, a);

  a = a.filter!(ai => ai < k).array;
  a.sort();
  n = a.length.to!int;

  auto calc(R)(R b, int ai)
  {
    auto dp = new bool[](k), dp2 = new bool[](k);
    dp[0] = true;

    foreach (bi; b) {
      dp2[] = dp[];
      dp[bi..$][] |= dp2[0..$-bi][];
    }

    return dp[k-ai..k].any;
  }

  auto bs = iota(0, n).map!(i => calc(chain(a.take(i), a.drop(i+1)), a[i])).assumeSorted;
  writeln(bs.lowerBound(true).length);
}
