Buggy python submission (verdict: Time Limit Exceeded):
N,M=map(int,input().split())
*A,=map(int,input().split())

# N本 まで使うか 10^4
dp=[0] * (N+1)

cost =[0, 2,5,5,4,5,6,3,7,6]

# 桁を追加する→最大のものに桁追加だから、問題なし
# 桁を入れ替える→無駄、初期状態では0桁しかないので単純に足す
# どの桁に追加すればよいか？二分探索をして決める。つまり、最大にしたいので逆順ソート済みにする？不要。先頭と末尾に追加で対応

def digit(x):
  d = 0
  while x % 10 != 0:
    d += 1
    x //= 10
  return d

for i in range(N+1):
    for a in A:
      # i > 0なら何かしら選んでないといけない
       if i + cost[a] <= N and (i == 0 or dp[i] > 0):
        new_i = i + cost[a]
        # 桁求める、数値のまま。桁まで保持しておけば計算の必要ない？そもそも64ビット越えなのでその対処が必要？
        d = digit(dp[i])
        tmp1 = dp[i] + (10** d) * a
        tmp2 = dp[i] * 10 + a
        tmps = [dp[new_i], tmp1, tmp2]
        m = max(tmps)
        dp[new_i] = m
        # print(new_i, tmps, m)

print(dp[N])

Fixed submission:
N,M=map(int,input().split())
*A,=map(int,input().split())

# 0初期化ではダメ。組合せ不可を表し、演算しても問題ない状態にしておく
dp=[-float("inf")] * (N+1)
dp[0]=0

cost =[0, 2,5,5,4,5,6,3,7,6]
for i in range(N+1):
    for a in A:
      # -inf初期化なので、不可能なものの演算結果も同じ
       new_i = i + cost[a]
       if new_i <= N:
        dp[new_i] = max([dp[new_i],  dp[i]+1])

sa = sorted(A, reverse=True)
n = N
ans = 0
while n > 0:
  for a in sa:
    nn = n-cost[a]
    if nn >= 0 and dp[n] == dp[nn] +1:
      ans = ans * 10 + a
      n -= cost[a]
      break

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
N,M=map(int,input().split())
*A,=map(int,input().split())

# N本 まで使うか 10^4
dp=[0] * (N+1)

cost =[0, 2,5,5,4,5,6,3,7,6]

# 桁を追加する→最大のものに桁追加だから、問題なし
# 桁を入れ替える→無駄、初期状態では0桁しかないので単純に足す
# どの桁に追加すればよいか？二分探索をして決める。つまり、最大にしたいので逆順ソート済みにする？不要。先頭と末尾に追加で対応

for i in range(N+1):
    for a in A:
      # i > 0なら何かしら選んでないといけない
       if i + cost[a] <= N and (i == 0 or dp[i] > 0):
        new_i = i + cost[a]
        # 桁求める、数値のままであとでやる。とりあえずpypy
        d = len(str(dp[i])) if dp[i] else 0
        tmp1 = dp[i] + (10** d) * a
        tmp2 = dp[i] * 10 + a
        tmps = [dp[new_i], tmp1, tmp2]
        m = max(tmps)
        dp[new_i] = m
        # print(new_i, tmps, m)


print(dp[N])

Fixed submission:
N,M=map(int,input().split())
*A,=map(int,input().split())

# 0初期化ではダメ。組合せ不可を表し、演算しても問題ない状態にしておく
dp=[-float("inf")] * (N+1)
dp[0]=0

cost =[0, 2,5,5,4,5,6,3,7,6]
for i in range(N+1):
    for a in A:
      # -inf初期化なので、不可能なものの演算結果も同じ
       new_i = i + cost[a]
       if new_i <= N:
        dp[new_i] = max([dp[new_i],  dp[i]+1])

sa = sorted(A, reverse=True)
n = N
ans = 0
while n > 0:
  for a in sa:
    nn = n-cost[a]
    if nn >= 0 and dp[n] == dp[nn] +1:
      ans = ans * 10 + a
      n -= cost[a]
      break

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
N,M=map(int,input().split())
*A,=map(int,input().split())

# N本 まで使うか 10^4
dp=[0] * (N+1)

cost =[0, 2,5,5,4,5,6,3,7,6]

# 桁を追加する→最大のものに桁追加だから、問題なし
# 桁を入れ替える→無駄、初期状態では0桁しかないので単純に足す
# どの桁に追加すればよいか？二分探索をして決める。つまり、最大にしたいので逆順ソート済みにする？不要。先頭と末尾に追加で対応

for i in range(N+1):
    for a in A:
      # i > 0なら何かしら選んでないといけない
       if i + cost[a] <= N and (i == 0 or dp[i] > 0):
        new_i = i + cost[a]
        # 桁求める
        d = len(str(dp[i])) if dp[i] else 0
        tmp1 = dp[i] + (10** d) * a
        tmp2 = dp[i] * 10 + a
        tmps = [dp[new_i], tmp1, tmp2]
        m = max(tmps)
        dp[new_i] = m
        # print(new_i, tmps, m)


print(dp[N])

Fixed submission:
N,M=map(int,input().split())
*A,=map(int,input().split())

# 0初期化ではダメ。組合せ不可を表し、演算しても問題ない状態にしておく
dp=[-float("inf")] * (N+1)
dp[0]=0

cost =[0, 2,5,5,4,5,6,3,7,6]
for i in range(N+1):
    for a in A:
      # -inf初期化なので、不可能なものの演算結果も同じ
       new_i = i + cost[a]
       if new_i <= N:
        dp[new_i] = max([dp[new_i],  dp[i]+1])

sa = sorted(A, reverse=True)
n = N
ans = 0
while n > 0:
  for a in sa:
    nn = n-cost[a]
    if nn >= 0 and dp[n] == dp[nn] +1:
      ans = ans * 10 + a
      n -= cost[a]
      break

print(ans)