Problem p03164 (C++)

Buggy submission (status: Runtime Error):
// bismillahir rahmanir rahim            //Author:Fayed Anik

#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>

using namespace std;
// using namespace __gnu_pbds;

// #define         ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>
#define ll long long
#define lf double
#define pb(x) push_back(x)
#define ull unsigned long long
#define sfl(a) scanf("%lld", &a)
#define sf(a) scanf("%d", &a)
#define pf(a) printf("%d\n", a)
#define pfl(a) printf("%lld\n", a)
#define FOR(x, n) for (ll x = 1; x <= n; ++x)
#define pii pair<ll, ll>
#define mp(a, b) make_pair(a, b)
#define UNIQUE(v) v.resize(distance(v.begin(), unique(v.begin(), v.end())))
#define mod 1000000007
#define INF 2e18
#define EPS 1e-15
#define f1 first
#define f2 second
#define all(v) v.begin(), v.end()
#define PI acos(-1)
#define printminusone printf("-1\n")
#define bug printf("bug")
#define FILEIN freopen("in.txt", "r", stdin)
#define FILEOUT freopen("out.txt", "w", stdout)

// ll SET(ll mask,ll pos){ return mask = (mask | (1ll<<pos)); }
// ll RESET(ll mask,ll pos){ return mask = mask & ~(1ll<<pos); }
// bool CHECK(ll mask,ll pos) { return (bool) (mask & (1ll<<pos)); }
// priority_queue <ll, vector<ll>, greater<ll> > pq;
// int dx[]={0,0,1,-1,1,1,-1,-1};
// int dy[]={1,-1,0,0,1,-1,1,-1};

ll dp[100][100005], a[1005], b[1005], n, target;

ll F(ll pos, ll now) {
  if (pos > n) {
    if (now >= target)
      return 0;
    else
      return INF;
  }
  ll &ret = dp[pos][now];
  if (~ret)
    return ret;
  ret = a[pos] + F(pos + 1, now + b[pos]);
  ret = min(ret, F(pos + 1, now));
  return dp[pos][now] = ret;
}

int main() {
  // freopen("input.txt","r",stdin);
  // freopen("output.txt","w",stdout);
  ll w;
  sfl(n), sfl(w);
  for (ll i = 1; i <= n; i++) {
    sfl(a[i]), sfl(b[i]);
  }
  ll lw = 0, hi = 1e5, mid, ans = 0, val;
  while (lw <= hi) {
    mid = (lw + hi) / 2;
    target = mid;
    memset(dp, -1, sizeof dp);
    val = F(1, 0);
    if (val <= w) {
      ans = mid;
      lw = mid + 1;
    } else {
      hi = mid - 1;
    }
  }
  pfl(ans);
  return 0;
}

Fixed submission:
// bismillahir rahmanir rahim            //Author:Fayed Anik

#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>

using namespace std;
// using namespace __gnu_pbds;

// #define         ordered_set tree<int, null_type,less<int>,
// rb_tree_tag,tree_order_statistics_node_update>
#define ll long long
#define lf double
#define pb(x) push_back(x)
#define ull unsigned long long
#define sfl(a) scanf("%lld", &a)
#define sf(a) scanf("%d", &a)
#define pf(a) printf("%d\n", a)
#define pfl(a) printf("%lld\n", a)
#define FOR(x, n) for (ll x = 1; x <= n; ++x)
#define pii pair<ll, ll>
#define mp(a, b) make_pair(a, b)
#define UNIQUE(v) v.resize(distance(v.begin(), unique(v.begin(), v.end())))
#define mod 1000000007
#define INF 2e18
#define EPS 1e-15
#define f1 first
#define f2 second
#define all(v) v.begin(), v.end()
#define PI acos(-1)
#define printminusone printf("-1\n")
#define bug printf("bug")
#define FILEIN freopen("in.txt", "r", stdin)
#define FILEOUT freopen("out.txt", "w", stdout)

// ll SET(ll mask,ll pos){ return mask = (mask | (1ll<<pos)); }
// ll RESET(ll mask,ll pos){ return mask = mask & ~(1ll<<pos); }
// bool CHECK(ll mask,ll pos) { return (bool) (mask & (1ll<<pos)); }
// priority_queue <ll, vector<ll>, greater<ll> > pq;
// int dx[]={0,0,1,-1,1,1,-1,-1};
// int dy[]={1,-1,0,0,1,-1,1,-1};

ll dp[101][100001], a[101], b[101], n, target;

ll F(ll pos, ll now) {
  if (pos > n) {
    if (now >= target)
      return 0;
    else
      return INF;
  }
  ll &ret = dp[pos][now];
  if (~ret)
    return ret;
  ret = a[pos] + F(pos + 1, now + b[pos]);
  ret = min(ret, F(pos + 1, now));
  return dp[pos][now] = ret;
}

int main() {
  // freopen("input.txt","r",stdin);
  // freopen("output.txt","w",stdout);
  ll w;
  sfl(n), sfl(w);
  for (ll i = 1; i <= n; i++) {
    sfl(a[i]), sfl(b[i]);
  }
  ll lw = 0, hi = 1e5, mid, ans = 0, val;
  while (lw <= hi) {
    mid = (lw + hi) / 2;
    target = mid;
    memset(dp, -1, sizeof dp);
    val = F(1, 0);
    if (val <= w) {
      ans = mid;
      lw = mid + 1;
    } else {
      hi = mid - 1;
    }
  }
  pfl(ans);
  return 0;
}