def coin(larger=False, single=False):
    """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """
    W2 = W + 1              # dp[W+1] に W より大きい時の全ての場合の情報を持たせる
    dp_max = float("inf")   # 総和価値の最大値
    dp = [dp_max] * (W2 + 1)
    dp[0] = 0               # 重さ 0 の時は価値 0

    for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
    if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

#######################################################################################################
import sys
input = sys.stdin.readline


def max2(x, y):
    return x if x > y else y

def min2(x, y):
    return x if x < y else y

W, N = map(int, input().split())                                # N: 品物の種類 W: 重量制限

# cost_list = []
# weight_list = []
# for _ in range(N):
#     """ cost と weight が逆転して入力されている場合有り """
#     weight, cost = map(int, input().split())
#     cost_list.append(cost)
#     weight_list.append(weight)

cost_list = [1]*N
weight_list = list(map(int, input().split()))

print(coin(single=False))


############################################################################################ def coin(larger=False, single=False):
    """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """
    W2 = W + 1              # dp[W+1] に W より大きい時の全ての場合の情報を持たせる
    dp_max = float("inf")   # 総和価値の最大値
    dp = [dp_max] * (W2 + 1)
    dp[0] = 0               # 重さ 0 の時は価値 0

    for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
    if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

####################################################################################################### coin """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """ W2 = W + 1 W2 W + 1 W 1 dp_max = float("inf") dp_max float("inf") float "inf" dp = [dp_max] * (W2 + 1) dp [dp_max] * (W2 + 1) [dp_max] dp_max W2 + 1 W2 1 dp[0] = 0 dp[0] dp 0 0 for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
     item range(N) range N if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
         single S = range(W2, weight_list[item] - 1, -1) S range(W2, weight_list[item] - 1, -1) range W2 weight_list[item] - 1 weight_list[item] weight_list item 1 -1 S = range(W2) S range(W2) range W2 for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
     weight S dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item]) dp[min2(weight + weight_list[item], W2)] dp min2(weight + weight_list[item], W2) min2 weight + weight_list[item] weight weight_list[item] weight_list item W2 min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item]) min2 dp[min2(weight + weight_list[item], W2)] dp min2(weight + weight_list[item], W2) min2 weight + weight_list[item] weight weight_list[item] weight_list item W2 dp[weight] + cost_list[item] dp[weight] dp weight cost_list[item] cost_list item if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

####################################################################################################### larger return min(dp[w] for w in range(W, W2+1)) min(dp[w] for w in range(W, W2+1)) min dp[w] dp w return dp[W] dp[W] dp W larger=False larger False single=False single False import sys sys input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline def max2(x, y):
    return x if x > y else y max2 return x if x > y else y x if x > y else y x > y x y x y x x y y def min2(x, y):
    return x if x < y else y min2 return x if x < y else y x if x < y else y x < y x y x y x x y y W, N = map(int, input().split()) W map(int, input().split()) map int input().split() ().split () input split N cost_list = [1]*N cost_list [1]*N [1] 1 N weight_list = list(map(int, input().split())) weight_list list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split print(coin(single=False)) print coin(single=False) coin single=False single False def min2(x, y):
    return x if x < y else y def min2(x, y):
    return x if x < y else y min2 def coin(larger=False, single=False):
    """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """
    W2 = W + 1              # dp[W+1] に W より大きい時の全ての場合の情報を持たせる
    dp_max = float("inf")   # 総和価値の最大値
    dp = [dp_max] * (W2 + 1)
    dp[0] = 0               # 重さ 0 の時は価値 0

    for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
    if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

####################################################################################################### def coin(larger=False, single=False):
    """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """
    W2 = W + 1              # dp[W+1] に W より大きい時の全ての場合の情報を持たせる
    dp_max = float("inf")   # 総和価値の最大値
    dp = [dp_max] * (W2 + 1)
    dp[0] = 0               # 重さ 0 の時は価値 0

    for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
    if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

####################################################################################################### coin input = sys.stdin.readline sys.stdin.readline input N = map(int, input().split()) map(int, input().split()) N W, N = map(int, input().split()) map(int, input().split()) W cost_list = [1]*N [1]*N cost_list weight_list = list(map(int, input().split())) list(map(int, input().split())) weight_list def max2(x, y):
    return x if x > y else y def max2(x, y):
    return x if x > y else y max2
def coin(larger=False, single=False):
    """
    ナップサックに入れる重さが W 丁度になる時の価値の最小値
    :param single: True = 重複なし

    dp[weight <= W+1] = 重さを固定した時の最小価値
    dp[W+1] = 重さがWより大きい時の最小価値
    """
    W2 = W + 1              # dp[W+1] に W より大きい時の全ての場合の情報を持たせる
    dp_max = float("inf")   # 総和価値の最大値
    dp = [dp_max] * (W2 + 1)
    dp[0] = 0               # 重さ 0 の時は価値 0

    for item in range(N):
        if single:
            S = range(W2, weight_list[item] - 1, -1)
        else:
            S = range(W2)
        for weight in S:
            dp[min2(weight + weight_list[item], W2)] = min2(dp[min2(weight + weight_list[item], W2)], dp[weight] + cost_list[item])
    if larger:
        return min(dp[w] for w in range(W, W2+1))
    else:
        return dp[W]

#######################################################################################################
import sys
input = sys.stdin.readline


def max2(x, y):
    return x if x > y else y

def min2(x, y):
    return x if x < y else y

W, N = map(int, input().split())                                # N: 品物の種類 W: 重量制限

# cost_list = []
# weight_list = []
# for _ in range(N):
#     """ cost と weight が逆転して入力されている場合有り """
#     weight, cost = map(int, input().split())
#     cost_list.append(cost)
#     weight_list.append(weight)

cost_list = [1]*N
weight_list = list(map(int, input().split()))

print(coin(single=False))


############################################################################################
