# x < yでyが不要とする。y抜きで[K-y,K)を作れる。

# このときにxを使っていないのならば、xも不要。

# xを使っているのならば、xy抜きで[K-x-y,K-x)を作れる。

# yを加えて、x抜きで[K-x,K)を作れる。

# よってy不要ならばx不要。

import numpy as np

import itertools



N,K = list(map(int,input().split()))

A = [int(x) for x in input().split()]

A.sort()



# カードは[0,N)-indexed



def test(i):

  # i番目のカードは不要

  dp = np.zeros(K,dtype=np.bool)

  dp[0] = True

  for a in itertools.chain(A[:i],A[i+1:]):

    dp[a:] = np.logical_or(dp[a:],dp[:-a])

  return not dp[-A[i]:].any()



left = -1 # 不要だと判明

right = N # 不要でないと判明

while right - left > 1:

  mid = (left+right)//2

  if test(mid):

    left = mid

  else:

    right = mid



   

answer = left+1

print(answer)
import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



import itertools



"""

・「必要」とは～～が存在

・x を含まない、[K-x,K) 内の総和が存在

・集合を指定すると、ある値段より上側

・全体としても単調性がある

"""



N,K,*A = list(map(int,read().split()))



A = [x if x <= K else K + 1 for x in A]

A.sort()



mask = (1 << K) - 1



def test(x):

    # x番目は必要

    if A[x] > K:

        return True

    dp = 1

    for a in itertools.chain(A[:x], A[x+1:]):

        dp |= (dp << a)

        dp &= mask

    dp >>= (K - A[x])

    return (dp > 0)



left = -1 # 必要

right = N # 不要

while left + 1 < right:

    x = (left + right) // 2

    if test(x):

        right = x

    else:

        left = x



answer = left + 1

print(answer)

# x < yでyが不要とする。y抜きで[K-y,K)を作れる。
# このときにxを使っていないのならば、xも不要。
# xを使っているのならば、xy抜きで[K-x-y,K-x)を作れる。
# yを加えて、x抜きで[K-x,K)を作れる。
# よってy不要ならばx不要。
import numpy as np
import itertools

N, K = list(map(int, input().split()))
A = [int(x) for x in input().split()]
A.sort()
# カードは[0,N)-indexed
def test(i):
    # i番目のカードは不要
    dp = np.zeros(K, dtype=np.bool)
    dp[0] = True
    for a in itertools.chain(A[:i], A[i + 1 :]):
        dp[a:] = np.logical_or(dp[a:], dp[:-a])
    return not dp[-A[i] :].any()


left = -1  # 不要だと判明
right = N  # 不要でないと判明
while right - left > 1:
    mid = (left + right) // 2
    if test(mid):
        left = mid
    else:
        right = mid
answer = left + 1
print(answer)

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import itertools

"""
・「必要」とは～～が存在
・x を含まない、[K-x,K) 内の総和が存在
・集合を指定すると、ある値段より上側
・全体としても単調性がある
"""
N, K, *A = list(map(int, read().split()))
A = [x if x <= K else K + 1 for x in A]
A.sort()
mask = (1 << K) - 1


def test(x):
    # x番目は必要
    if A[x] > K:
        return True
    dp = 1
    for a in itertools.chain(A[:x], A[x + 1 :]):
        dp |= dp << a
        dp &= mask
    dp >>= K - A[x]
    return dp > 0


left = -1  # 必要
right = N  # 不要
while left + 1 < right:
    x = (left + right) // 2
    if test(x):
        right = x
    else:
        left = x
answer = left + 1
print(answer)

-# x < yでyが不要とする。y抜きで[K-y,K)を作れる。 -# このときにxを使っていないのならば、xも不要。 -# xを使っているのならば、xy抜きで[K-x-y,K-x)を作れる。 -# yを加えて、x抜きで[K-x,K)を作れる。 -# よってy不要ならばx不要。 -import numpy as np +import sys + +read = sys.stdin.buffer.read +readline = sys.stdin.buffer.readline +readlines = sys.stdin.buffer.readlines -N, K = list(map(int, input().split())) -A = [int(x) for x in input().split()] +""" +・「必要」とは～～が存在 +・x を含まない、[K-x,K) 内の総和が存在 +・集合を指定すると、ある値段より上側 +・全体としても単調性がある +""" +N, K, *A = list(map(int, read().split())) +A = [x if x <= K else K + 1 for x in A] -# カードは[0,N)-indexed -def test(i): -    # i番目のカードは不要 -    dp = np.zeros(K, dtype=np.bool) -    dp[0] = True -    for a in itertools.chain(A[:i], A[i + 1 :]): -        dp[a:] = np.logical_or(dp[a:], dp[:-a]) -    return not dp[-A[i] :].any() +mask = (1 << K) - 1 -left = -1  # 不要だと判明 -right = N  # 不要でないと判明 -while right - left > 1: -    mid = (left + right) // 2 -    if test(mid): -        left = mid +def test(x): +    # x番目は必要 +    if A[x] > K: +        return True +    dp = 1 +    for a in itertools.chain(A[:x], A[x + 1 :]): +        dp |= dp << a +        dp &= mask +    dp >>= K - A[x] +    return dp > 0 + + +left = -1  # 必要 +right = N  # 不要 +while left + 1 < right: +    x = (left + right) // 2 +    if test(x): +        right = x -        right = mid +        left = x