Problem p03128 (C++)

Buggy submission (status: Time Limit Exceeded):
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;

template <class T, class U> constexpr bool chmin(T &a, const U b) {
  if (a <= b)
    return false;
  a = b;
  return true;
}
template <class T, class U> constexpr bool chmax(T &a, const U b) {
  if (a >= b)
    return false;
  a = b;
  return true;
}
#define bit(n, k) ((n >> k) & 1)

// デバッグ
template <class T> void Vout(vector<T> &V) {
  cout << "\nstart\n";
  const int sz = V.size();
  for (int i = 0; i < sz; i++) {
    cout << i << " " << V[i] << '\n';
  }
  cout << "end\n" << endl;
}

template <class T> void VPout(vector<T> &V) {
  cout << "\nstart\n";
  const int sz = V.size();
  for (int i = 0; i < sz; i++) {
    cout << i << " " << V[i].first << " " << V[i].second << '\n';
  }
  cout << "end\n" << endl;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

constexpr int MAX = 1 << 30;
constexpr ll INF = 1LL << 62;
constexpr int MOD = 1e9 + 7;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};

//__builtin_popcount(S);
// #define int ll
// vector<vector<int>> data(3, vector<int>(4));
// vector.resize(a,vector<int>(b,-1));
// vector<vector<vector<要素の型>>> 変数名(要素数1,
// vector<vector<要素の型>>(要素数2, vector<要素の型>(要素数3, 初期値)));

int dp[11000];

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int N, M;
  cin >> N >> M;
  vector<int> A(M);
  for (int i = 0; i < M; i++)
    cin >> A[i];
  int need[] = {0, 2, 5, 5, 4, 5, 6, 3, 7, 6};
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      int x = need[A[j]];
      chmax(dp[i + x], dp[i] + 1);
    }
  }
  int now = N;
  sort(A.rbegin(), A.rend());
  while (now != 0) {
    for (int i = 0; i < M; i++) {
      int x = need[A[i]];
      if (now - x < 0 || (now - x != 0 && dp[now - x] == 0))
        continue;
      if (dp[now] == dp[now - x] + 1) {
        cout << A[i];
        now -= x;
        break;
      }
    }
  }
  cout << endl;
}

Fixed submission:
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;

template <class T, class U> constexpr bool chmin(T &a, const U b) {
  if (a <= b)
    return false;
  a = b;
  return true;
}
template <class T, class U> constexpr bool chmax(T &a, const U b) {
  if (a >= b)
    return false;
  a = b;
  return true;
}
#define bit(n, k) ((n >> k) & 1)

// デバッグ
template <class T> void Vout(vector<T> &V) {
  cout << "\nstart\n";
  const int sz = V.size();
  for (int i = 0; i < sz; i++) {
    cout << i << " " << V[i] << '\n';
  }
  cout << "end\n" << endl;
}

template <class T> void VPout(vector<T> &V) {
  cout << "\nstart\n";
  const int sz = V.size();
  for (int i = 0; i < sz; i++) {
    cout << i << " " << V[i].first << " " << V[i].second << '\n';
  }
  cout << "end\n" << endl;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

constexpr int MAX = 1 << 30;
constexpr ll INF = 1LL << 62;
constexpr int MOD = 1e9 + 7;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, -1, 1};

//__builtin_popcount(S);
// #define int ll
// vector<vector<int>> data(3, vector<int>(4));
// vector.resize(a,vector<int>(b,-1));
// vector<vector<vector<要素の型>>> 変数名(要素数1,
// vector<vector<要素の型>>(要素数2, vector<要素の型>(要素数3, 初期値)));

int dp[11000];

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int N, M;
  cin >> N >> M;
  vector<int> A(M);
  for (int i = 0; i < M; i++)
    cin >> A[i];
  int need[] = {0, 2, 5, 5, 4, 5, 6, 3, 7, 6};
  for (int i = 0; i < N; i++) {
    if (i != 0 && dp[i] == 0)
      continue;
    for (int j = 0; j < M; j++) {
      int x = need[A[j]];
      chmax(dp[i + x], dp[i] + 1);
    }
  }
  int now = N;
  sort(A.rbegin(), A.rend());
  while (now != 0) {
    for (int i = 0; i < M; i++) {
      int x = need[A[i]];
      if (now - x < 0 || (now - x != 0 && dp[now - x] == 0))
        continue;
      if (dp[now] == dp[now - x] + 1) {
        cout << A[i];
        now -= x;
        break;
      }
    }
  }
  cout << endl;
}