Problem p03048 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define y0 y12
#define y1 y22
#define INF 987654321
#define PI 3.141592653589793238462643383279502884
#define fup(i, a, b, c) for (int(i) = (a); (i) <= (b); (i) += (c))
#define fdn(i, a, b, c) for (int(i) = (a); (i) >= (b); (i) -= (c))
#define MEM0(a) memset((a), 0, sizeof(a));
#define MEM_1(a) memset((a), -1, sizeof(a));
#define ALL(a) a.begin(), a.end()
#define SYNC                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef pair<double, double> Pd;
typedef vector<int> Vi;
typedef vector<ll> Vll;
typedef vector<double> Vd;
typedef vector<Pi> VPi;
typedef vector<Pll> VPll;
typedef vector<Pd> VPd;
typedef tuple<int, int, int> iii;
typedef tuple<ll, ll, ll> LLL;
typedef vector<iii> Viii;
typedef vector<LLL> VLLL;
typedef complex<double> base;
const ll MOD = 998244353;
ll POW(ll a, ll b, ll MMM = MOD) {
  ll ret = 1;
  for (; b; b >>= 1, a = (a * a) % MMM)
    if (b & 1)
      ret = (ret * a) % MMM;
  return ret;
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) {
  if (a == 0 || b == 0)
    return a + b;
  return a * (b / gcd(a, b));
}
int dx[] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[] = {1, 0, -1, 0, 1, -1, 1, -1};

int r, g, b, n;
ll d[3001][3];
ll go(int N, int c) {
  if (c == 3)
    return 0;
  if (N == n)
    return 1;
  ll &ret = d[N][c];
  if (ret != -1)
    return ret;
  ret = 0;
  ret += go(N, c + 1);
  if (c == 0)
    ret += go(N + r, c);
  if (c == 1)
    ret += go(N + g, c);
  if (c == 2)
    ret += go(N + b, c);
  return ret;
}
int main() {
  MEM_1(d);
  scanf("%d%d%d%d", &r, &g, &b, &n);
  printf("%lld", go(0, 0));
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define y0 y12
#define y1 y22
#define INF 987654321
#define PI 3.141592653589793238462643383279502884
#define fup(i, a, b, c) for (int(i) = (a); (i) <= (b); (i) += (c))
#define fdn(i, a, b, c) for (int(i) = (a); (i) >= (b); (i) -= (c))
#define MEM0(a) memset((a), 0, sizeof(a));
#define MEM_1(a) memset((a), -1, sizeof(a));
#define ALL(a) a.begin(), a.end()
#define SYNC                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef pair<double, double> Pd;
typedef vector<int> Vi;
typedef vector<ll> Vll;
typedef vector<double> Vd;
typedef vector<Pi> VPi;
typedef vector<Pll> VPll;
typedef vector<Pd> VPd;
typedef tuple<int, int, int> iii;
typedef tuple<ll, ll, ll> LLL;
typedef vector<iii> Viii;
typedef vector<LLL> VLLL;
typedef complex<double> base;
const ll MOD = 998244353;
ll POW(ll a, ll b, ll MMM = MOD) {
  ll ret = 1;
  for (; b; b >>= 1, a = (a * a) % MMM)
    if (b & 1)
      ret = (ret * a) % MMM;
  return ret;
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) {
  if (a == 0 || b == 0)
    return a + b;
  return a * (b / gcd(a, b));
}
int dx[] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[] = {1, 0, -1, 0, 1, -1, 1, -1};

int r, g, b, n;
ll d[3001][3];
ll go(int N, int c) {
  if (c == 3)
    return 0;
  if (N == n)
    return 1;
  if (N > n)
    return 0;
  ll &ret = d[N][c];
  if (ret != -1)
    return ret;
  ret = 0;
  ret += go(N, c + 1);
  if (c == 0)
    ret += go(N + r, c);
  if (c == 1)
    ret += go(N + g, c);
  if (c == 2)
    ret += go(N + b, c);
  return ret;
}
int main() {
  MEM_1(d);
  scanf("%d%d%d%d", &r, &g, &b, &n);
  printf("%lld", go(0, 0));
}