Problem p03465 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i, a) for (auto &&i : a)
#define FOR(i, a, b) for (ll i = (a), __last_##i = (b); i < __last_##i; i++)
#define RFOR(i, a, b) for (ll i = (b)-1, __last_##i = (a); i >= __last_##i; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, 0, n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define chmin(x, v) x = min(x, v)
#define chmax(x, v) x = max(x, v)

const ll linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);

template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  each(x, vec) is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << endl;
    os << vec[i];
  }
  return os;
}
ll solve(const vector<ll> &A) {
  const ll n = A.size();
  if (n == 1)
    return A[0];
  vector<ll> S = A;
  rep(i, 1, n) S[i] += S[i - 1];
  if (A[n - 1] >= S[n - 2])
    return A[n - 1];
  ll res = (S[n - 1] + 1) / 2;
  map<ll, ll> cnt;
  rep(i, n) cnt[A[i]]++;
  // if (cnt.size() * S[n-1] >= ll(1e7)) return res;
  vector<ll> dp(S[n - 1] + 1, -1);
  dp[0] = 0;
  each(p, cnt) {
    ll x, m;
    tie(x, m) = p;
    vector<ll> ndp = dp;
    each(i, ndp) if (i >= 0) i = m;
    rep(i, ndp.size()) {
      if (ndp[i] <= 0)
        continue;
      if (i + x < ndp.size())
        chmax(ndp[i + x], ndp[i] - 1);
    }
    dp = ndp;
  }
  rep(i, res, dp.size()) if (dp[i] >= 0) return i;
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll n;
  cin >> n;
  vector<ll> A(n);
  cin >> A;
  sort(all(A));
  // vector<ll> S = A;
  // rep(i, 1, n) S[i] += S[i-1];
  // vector<ll> a;
  // rep(i, 1, 1<<n) {
  //     ll sum = 0;
  //     rep(j, n) if (i>>j & 1) sum += A[j];
  //     a.pb(sum);
  // }
  // sort(all(a));
  // cout << S << endl;
  // cout << a << endl;
  // cout << a[a.size()/2] << endl;
  cout << solve(A) << endl;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i, a) for (auto &&i : a)
#define FOR(i, a, b) for (ll i = (a), __last_##i = (b); i < __last_##i; i++)
#define RFOR(i, a, b) for (ll i = (b)-1, __last_##i = (a); i >= __last_##i; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, 0, n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define chmin(x, v) x = min(x, v)
#define chmax(x, v) x = max(x, v)

const ll linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);

template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  each(x, vec) is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << endl;
    os << vec[i];
  }
  return os;
}
ll solve(const vector<ll> &A) {
  const ll n = A.size();
  if (n == 1)
    return A[0];
  vector<ll> S = A;
  rep(i, 1, n) S[i] += S[i - 1];
  if (A[n - 1] >= S[n - 2])
    return A[n - 1];
  ll res = (S[n - 1] + 1) / 2;
  map<ll, ll> cnt;
  rep(i, n) cnt[A[i]]++;
  if (cnt.size() * S[n - 1] >= ll(1e9))
    return res;
  vector<ll> dp(S[n - 1] + 1, -1);
  dp[0] = 0;
  each(p, cnt) {
    ll x, m;
    tie(x, m) = p;
    vector<ll> ndp = dp;
    each(i, ndp) if (i >= 0) i = m;
    rep(i, ndp.size()) {
      if (ndp[i] <= 0)
        continue;
      if (i + x < ndp.size())
        chmax(ndp[i + x], ndp[i] - 1);
    }
    dp = ndp;
  }
  rep(i, res, dp.size()) if (dp[i] >= 0) return i;
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll n;
  cin >> n;
  vector<ll> A(n);
  cin >> A;
  sort(all(A));
  // vector<ll> S = A;
  // rep(i, 1, n) S[i] += S[i-1];
  // vector<ll> a;
  // rep(i, 1, 1<<n) {
  //     ll sum = 0;
  //     rep(j, n) if (i>>j & 1) sum += A[j];
  //     a.pb(sum);
  // }
  // sort(all(a));
  // cout << S << endl;
  // cout << a << endl;
  // cout << a[a.size()/2] << endl;
  cout << solve(A) << endl;
}