Problem p01450 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
template <class T> using Table = vector<vector<T>>;
const ld eps = 1e-9;

// < "D:\D_Download\Visual Studio
// 2015\Projects\programing_contest_c++\Debug\a.txt"
int dp[2][201][10001];
int main() {

  int N, W;
  cin >> N >> W;
  vector<int> ws(N);
  for (int i = 0; i < N; ++i) {
    int a;
    cin >> a;
    ws[i] = a;
  }
  if (*min_element(ws.begin(), ws.end()) > W) {
    cout << 1 << endl;
    return 0;
  }
  if (accumulate(ws.begin(), ws.end(), 0) <= W) {
    cout << 1 << endl;
    return 0;
  }
  sort(ws.begin(), ws.end(), greater<int>());
  for (int f = 0; f < 201; ++f) {
    for (int j = 0; j < 10001; ++j) {
      dp[0][f][j] = 0;
    }
  }
  dp[0][200][0] = 1;

  int tar, cur;
  for (int i = 0; i < N; ++i) {
    tar = i & 1;
    cur = tar ^ 1;
    if (i == 0)
      assert(tar == 0 && cur == 1);
    for (int f = 0; f < 201; ++f) {
      for (int j = 0; j < 10001; ++j) {
        dp[cur][f][j] = 0;
        dp[tar][f][j] %= 1000000007;
      }
    }
    for (int f = 0; f < i; ++f) {
      for (int w = 0; w < 10001; ++w) {
        int nextw = w + ws[i];
        if (nextw <= W) {
          dp[cur][f][nextw] += dp[tar][f][w];
        }
        { dp[cur][i][w] += dp[tar][f][w]; }
      }
    }
    {
      int f = 200;
      {
        for (int w = 0; w < 10001; ++w) {
          int nextw = w + ws[i];
          if (nextw <= W) {
            dp[cur][f][nextw] += dp[tar][f][w];
          }
          { dp[cur][i][w] += dp[tar][f][w]; }
        }
      }
    }
  }
  long long int ans = 0;
  for (int f = 0; f < N; ++f) {
    for (int j = W - ws[f] + 1; j <= W; ++j) {
      ans += dp[cur][f][j];
    }
  }
  cout << ans % 1000000007 << endl;
  return 0;
}
//
// int N, W; cin >> N >> W;
// vector<int>ws(N);
// for (int i = 0; i < N; ++i) {
//	int a; cin >> a;
//	ws[i] = a;
//}
// int dp[2][10001];

Fixed submission:
#include "bits/stdc++.h"
#include <unordered_map>
#include <unordered_set>
#pragma warning(disable : 4996)
using namespace std;
using ld = long double;
template <class T> using Table = vector<vector<T>>;
const ld eps = 1e-9;

// < "D:\D_Download\Visual Studio
// 2015\Projects\programing_contest_c++\Debug\a.txt"
int dp[2][201][10001];
int main() {

  int N, W;
  cin >> N >> W;
  vector<int> ws(N);
  for (int i = 0; i < N; ++i) {
    int a;
    cin >> a;
    ws[i] = a;
  }
  if (*min_element(ws.begin(), ws.end()) > W) {
    cout << 1 << endl;
    return 0;
  }
  if (accumulate(ws.begin(), ws.end(), 0) <= W) {
    cout << 1 << endl;
    return 0;
  }
  sort(ws.begin(), ws.end(), greater<int>());
  for (int f = 0; f < 201; ++f) {
    for (int j = 0; j < 10001; ++j) {
      dp[0][f][j] = 0;
    }
  }
  dp[0][200][0] = 1;

  int tar, cur;
  for (int i = 0; i < N; ++i) {
    tar = i & 1;
    cur = tar ^ 1;
    if (i == 0)
      assert(tar == 0 && cur == 1);
    for (int f = 0; f < 201; ++f) {
      for (int j = 0; j < 10001; ++j) {
        dp[cur][f][j] = 0;
        dp[tar][f][j] %= 1000000007;
      }
    }
    for (int f = 0; f < i; ++f) {
      for (int w = 0; w < 10001; ++w) {
        int nextw = w + ws[i];
        if (nextw <= W) {
          dp[cur][f][nextw] += dp[tar][f][w];
        }
        { dp[cur][i][w] += dp[tar][f][w]; }
      }
    }
    {
      int f = 200;
      {
        for (int w = 0; w < 10001; ++w) {
          int nextw = w + ws[i];
          if (nextw <= W) {
            dp[cur][f][nextw] += dp[tar][f][w];
          }
          { dp[cur][i][w] += dp[tar][f][w]; }
        }
      }
    }
  }
  long long int ans = 0;
  for (int f = 0; f < N; ++f) {
    for (int j = max(0, W - ws[f] + 1); j <= W; ++j) {
      ans += dp[cur][f][j];
    }
  }
  cout << ans % 1000000007 << endl;
  return 0;
}
//
// int N, W; cin >> N >> W;
// vector<int>ws(N);
// for (int i = 0; i < N; ++i) {
//	int a; cin >> a;
//	ws[i] = a;
//}
// int dp[2][10001];