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

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

#define MOD 1000000007

int N, W, M;
int w[201], wt[201], wr[201];
int dp[10001][201], tmp[10001][201];

int main() {
  while (cin >> N >> W) {
    for (int i = 0; i < N; i++) {
      cin >> w[i];
    }

    sort(w, w + N);

    wt[0] = 0;
    wr[0] = w[0];

    for (int i = 1; i < N; i++) {
      if (w[i] > w[i - 1]) {
        wt[i] = wt[i - 1] + 1;
        wr[wt[i]] = w[i];
      } else {
        wt[i] = wt[i - 1];
      }
    }
    M = wt[N - 1] + 1;

    memset(dp, 0, sizeof(dp));
    dp[0][M] = 1;

    for (int i = 0; i < N; i++) {
      memset(tmp, 0, sizeof(tmp));

      for (int j = 0; j <= W; j++) {
        for (int k = 0; k <= M; k++) {
          if (dp[j][k] == 0) {
            continue;
          }

          if (j + w[i] <= W) {
            tmp[j + w[i]][k] += dp[j][k];
            tmp[j + w[i]][k] %= MOD;
          }
          if (k == M) {
            tmp[j][wt[i]] += dp[j][k];
            tmp[j][wt[i]] %= MOD;
          } else {
            tmp[j][k] += dp[j][k];
            tmp[j][k] %= MOD;
          }
        }
      }

      for (int j = 0; j <= W; j++) {
        for (int k = 0; k <= M; k++) {
          dp[j][k] = tmp[j][k];
        }
      }
    }

    /*
    for(int i=0;i<=N;i++){
      for(int j=0;j<=W;j++){
        for(int k=0;k<=M;k++){
          printf("%2d",dp[i][j][k]);
        }
        cout<<endl;
      }
      cout<<endl;
    }
    */

    int ans = 0;

    for (int j = 0; j <= W; j++) {
      for (int k = 0; k <= M; k++) {
        if (k == M || j + wr[k] > W) {
          ans += dp[j][k];
          ans %= MOD;
        }
      }
    }

    cout << ans << endl;
  }
}

Error: -11

Fixed submission:

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

#define MOD 1000000007

int N, W, M;
int w[201], wt[201], wr[201];
int dp[201][10001][201];

int main() {
  while (cin >> N >> W) {
    for (int i = 0; i < N; i++) {
      cin >> w[i];
    }

    sort(w, w + N);

    wt[0] = 0;
    wr[0] = w[0];

    for (int i = 1; i < N; i++) {
      if (w[i] > w[i - 1]) {
        wt[i] = wt[i - 1] + 1;
        wr[wt[i]] = w[i];
      } else {
        wt[i] = wt[i - 1];
      }
    }
    M = wt[N - 1] + 1;

    memset(dp, 0, sizeof(dp));
    dp[0][0][M] = 1;

    for (int i = 0; i < N; i++) {
      for (int j = 0; j <= W; j++) {
        for (int k = 0; k <= M; k++) {
          if (dp[i][j][k] == 0) {
            continue;
          }

          if (j + w[i] <= W) {
            dp[i + 1][j + w[i]][k] += dp[i][j][k];
            dp[i + 1][j + w[i]][k] %= MOD;
          }
          if (k == M) {
            dp[i + 1][j][wt[i]] += dp[i][j][k];
            dp[i + 1][j][wt[i]] %= MOD;
          } else {
            dp[i + 1][j][k] += dp[i][j][k];
            dp[i + 1][j][k] %= MOD;
          }
        }
      }
    }

    /*
    for(int i=0;i<=N;i++){
      for(int j=0;j<=W;j++){
        for(int k=0;k<=M;k++){
          printf("%2d",dp[i][j][k]);
        }
        cout<<endl;
      }
      cout<<endl;
    }
    */

    int ans = 0;

    for (int j = 0; j <= W; j++) {
      for (int k = 0; k <= M; k++) {
        if (k == M || j + wr[k] > W) {
          ans += dp[N][j][k];
          ans %= MOD;
        }
      }
    }

    cout << ans << endl;
  }
}