Problem p00154 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define REP(i, n) for (int i = 0; i < n; ++i)
#define IREP(it, array)                                                        \\
  for (vector<int>::iterator it = array.begin(); it != array.end(); ++it)
#define PREP(it, array)                                                        \\
  for (vector<P>::iterator it = array.begin(); it != array.end(); ++it)
#define SREP(it, array)                                                        \\
  for (vector<string>::iterator it = array.begin(); it != array.end(); ++it)

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(), (x).end()

const int INF = 1 << 29;
const double EPS = 1e-9;
double zero(double d) { return d < EPS ? 0.0 : d; }

typedef long long LL;
typedef pair<int, int> P;

int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(7);

  int m;
  while (cin >> m, m) {
    int a[7], b[7];
    REP(i, m) {
      int aa, bb;
      cin >> aa >> bb;
      a[i] = aa;
      b[i] = bb;
    }

    int dp[m + 1][1000 + 1];
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;

    REP(i, m) {
      REP(j, 1001) {
        REP(k, b[i] + 1) {
          if (j + a[i] * k <= 1000)
            dp[i + 1][j + a[i] * k] += dp[i][j];
        }
      }
    }

    int g;
    cin >> g;
    REP(_t, g) {
      int n;
      cin >> n;
      cout << dp[m][n] << endl;
    }
  }

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

#define REP(i, n) for (int i = 0; i < n; ++i)
#define IREP(it, array)                                                        \\
  for (vector<int>::iterator it = array.begin(); it != array.end(); ++it)
#define PREP(it, array)                                                        \\
  for (vector<P>::iterator it = array.begin(); it != array.end(); ++it)
#define SREP(it, array)                                                        \\
  for (vector<string>::iterator it = array.begin(); it != array.end(); ++it)

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(), (x).end()

const int INF = 1 << 29;
const double EPS = 1e-9;
double zero(double d) { return d < EPS ? 0.0 : d; }

typedef long long LL;
typedef pair<int, int> P;

int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(7);

  int m;
  while (cin >> m, m) {
    int a[7], b[7];
    REP(i, m) {
      int aa, bb;
      cin >> aa >> bb;
      a[i] = aa;
      b[i] = bb;
    }

    int dp[7 + 1][1000 + 1];
    memset(dp, 0, sizeof(dp));
    dp[0][0] = 1;

    REP(i, 7) {
      REP(j, 1001) {
        REP(k, b[i] + 1) {
          if (j + a[i] * k <= 1000)
            dp[i + 1][j + a[i] * k] += dp[i][j];
        }
      }
    }

    int g;
    cin >> g;
    REP(_t, g) {
      int n;
      cin >> n;
      cout << dp[m][n] << endl;
    }
  }

  return 0;
}