# コイン問題
# 個数制限なしナップサックで解く
N, M = map(int, input().split())  # N円, M種類の硬貨
C = list(map(int, input().split()))
dp = [[10**10]*(N+1) for _ in range(M+1)]  # m種類目までの硬貨を使ってn円払うときの最小枚数

dp[0][0] = 0
# M種類の中のi番目のコインを使う
for i in range(M):
    for j in range(N+1):
        # 使わない場合
        dp[i+1][j] = min(dp[i+1][j], dp[i][j])
        # 使う場合
        if j + C[i] > N:  # 今i番目のコインを使った時にN円を超えるようならダメ
            continue
        # dp[i+1][j]+1は同じ段からの遷移を表している
        dp[i+1][j+C[i]] = min(dp[i][j]+1, dp[i+1][j]+1)
print(dp[M][N])
 N, M = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M C = list(map(int, input().split())) C list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split [10**10]*(N+1) for _ in range(M+1) for _ in range(M+1) _ range(M+1) range M+1 M 1 for _ in range(M+1) [10**10]*(N+1) [10**10] 10**10 10 10 N+1 N 1 dp = [[10**10]*(N+1) for _ in range(M+1)] dp [[10**10]*(N+1) for _ in range(M+1)] dp[0][0] = 0 dp[0][0] [0] dp 0 0 0 for i in range(M):
    for j in range(N+1):
        # 使わない場合
        dp[i+1][j] = min(dp[i+1][j], dp[i][j])
        # 使う場合
        if j + C[i] > N:  # 今i番目のコインを使った時にN円を超えるようならダメ
            continue
        # dp[i+1][j]+1は同じ段からの遷移を表している
        dp[i+1][j+C[i]] = min(dp[i][j]+1, dp[i+1][j]+1) i range(M) range M for j in range(N+1):
        # 使わない場合
        dp[i+1][j] = min(dp[i+1][j], dp[i][j])
        # 使う場合
        if j + C[i] > N:  # 今i番目のコインを使った時にN円を超えるようならダメ
            continue
        # dp[i+1][j]+1は同じ段からの遷移を表している
        dp[i+1][j+C[i]] = min(dp[i][j]+1, dp[i+1][j]+1) j range(N+1) range N+1 N 1 dp[i+1][j] = min(dp[i+1][j], dp[i][j]) dp[i+1][j] [i+1] dp i+1 i 1 j min(dp[i+1][j], dp[i][j]) min dp[i+1][j] [i+1] dp i+1 i 1 j dp[i][j] [i] dp i j if j + C[i] > N:  # 今i番目のコインを使った時にN円を超えるようならダメ
            continue
        # dp[i+1][j]+1は同じ段からの遷移を表している
         j + C[i] > N j + C[i] j C[i] C i N continue dp[i+1][j+C[i]] = min(dp[i][j]+1, dp[i+1][j]+1) dp[i+1][j+C[i]] [i+1] dp i+1 i 1 j+C[i] j C[i] C i min(dp[i][j]+1, dp[i+1][j]+1) min dp[i][j]+1 dp[i][j] [i] dp i j 1 dp[i+1][j]+1 dp[i+1][j] [i+1] dp i+1 i 1 j 1 print(dp[M][N]) print dp[M][N] [M] dp M N N, M = map(int, input().split()) map(int, input().split()) N M = map(int, input().split()) map(int, input().split()) M dp = [[10**10]*(N+1) for _ in range(M+1)] [[10**10]*(N+1) for _ in range(M+1)] dp C = list(map(int, input().split())) list(map(int, input().split())) C
# コイン問題
# 個数制限なしナップサックで解く
N, M = map(int, input().split())  # N円, M種類の硬貨
C = list(map(int, input().split()))
dp = [[10**10]*(N+1) for _ in range(M+1)]  # m種類目までの硬貨を使ってn円払うときの最小枚数

dp[0][0] = 0
# M種類の中のi番目のコインを使う
for i in range(M):
    for j in range(N+1):
        # 使わない場合
        dp[i+1][j] = min(dp[i+1][j], dp[i][j])
        # 使う場合
        if j + C[i] > N:  # 今i番目のコインを使った時にN円を超えるようならダメ
            continue
        # dp[i+1][j]+1は同じ段からの遷移を表している
        dp[i+1][j+C[i]] = min(dp[i][j]+1, dp[i+1][j]+1)
print(dp[M][N])

