Problem p03008 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>   // abs() for float, and fabs()
#include <cstdlib> // abs() for integer
#include <functional>
#include <iomanip>
#include <iostream>
#include <map> // pair
#include <math.h>
#include <numeric>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>
typedef std::stack<int> IntStack;
typedef std::stack<char> charStack;
#define START 0
#define FORWARD 1
#define BACK 2
using namespace std;
using ll = long long;
typedef pair<ll, ll> pll;
bool comp(const pll &a, const pll &b) { return a.first < b.first; }
//*********************************************************
// 最大公約数（Greatest Common Divisor）を返す。
// 引数に０がある場合は０を返す。
//*********************************************************
ll gcd(ll a, ll b) {
  ll tmp, r;
  if (a < b) {
    tmp = a;
    a = b;
    b = tmp;
  }

  /* ユークリッドの互除法 */
  r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
  //// 引数に０がある場合は０を返す
  // if ((0 == m) || (0 == n))
  //	return 0;

  //// ユークリッドの方法
  // while (m != n)
  //{
  //	if (m > n) m = m - n;
  //	else         n = n - m;
  // }
  // return m;
} // gcd

int main() {
  ll a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, ans = 0;
  ll x[100004] = {};
  ll y[100004] = {};
  ll z[100004] = {};
  vector<tuple<ll, ll>> vec;
  string s;
  string t;
  // IntStack yStack;
  // charStack Stack;
  // vector<pair<int, int> > pairs(a);
  // cout << LLONG_MAX<< endl;

  cin >> a;
  for (int i = 0; i < 3; i++) {
    cin >> x[i];
  }
  for (int i = 0; i < 3; i++) {
    cin >> y[i];
  }
  z[0] = a;
  for (int k = 0; k < 3; k++) {
    for (int i = 0; i <= a; i++) {
      if (i >= x[k] && x[k] < y[k]) {
        z[i] = max(z[i], z[i - x[k]] + (y[k] - x[k]));
      }
    }
  }
  for (int i = 0; i <= a; i++) {
    ans = max(ans, z[i]);
  }
  z[0] = ans;
  for (int k = 0; k < 3; k++) {
    for (int i = 0; i <= ans; i++) {
      if (i >= y[k] && x[k] > y[k]) {
        z[i] = max(z[i], z[i - y[k]] + (x[k] - y[k]));
      }
    }
  }

  // for (int i = 0; i <= a; i++)
  //{
  //	cout << z[i] << endl;

  //}

  // cout << endl;
  b = ans;
  for (int i = 0; i <= b; i++) {
    ans = max(ans, z[i]);
  }
  cout << ans << endl;

  ////std::cout << std::fixed;
  // cout << std::setprecision(20) << << endl;
  // cout << d+1 << endl;
  // cout << "" << endl;

  return 0;
}
// sort(x, x + a, std::greater<ll>());

// char型の文字数字は、-'0'で数値に変換できる
// accumulate(x, x + a, 0);//int型までの配列の合計
// memcpy(x, visited, sizeof(ll)*n);
// void kansuu(ll num, ll visited[10]) {}
// kansuu(1, zz);
// cout << setprecision(15) << v << endl;
// cout << char(z - 'a');
// log10(i) + 1 //10進数の桁数を取得
//
// int temp;
// for (int i = 0; i < n - 1; i++) {
//	for (int j = n - 1; j > i; j--) {
//		if (w[j - 1] < w[j]) {  /* 前の要素の方が大きかったら */
//			temp = w[j];        /* 交換する */
//			w[j] = w[j - 1];
//			w[j - 1] = temp;
//		}
//	}
// }
//
// 最小公倍数
// ll x = a * b;
// ll tmp;
///* 自然数 a > b を確認・入替 */
// if (a<b) {
//	tmp = a;
//	a = b;
//	b = tmp;
// }
///* ユークリッドの互除法 */
// ll r = a % b;
// while (r != 0) {
//	a = b;
//	b = r;
//	r = a % b;
// }
// a = x / b;//答え

/*vector<pair<ll, ll> > hoges(a);
for (int i = 0; i < a; i++)
{
cin >> x[i];
cin >> y[i];
hoges[i] = make_pair(x[i], y[i]);
}
sort(hoges.begin(),hoges.end(),comp);
for (int i = 0; i < a; i++)
{
if (hoges[i].second>=b)
{
ans += hoges[i].first*b;
break;
}
else
{
ans += hoges[i].first*hoges[i].second;
b -= hoges[i].second;

}
}*/

Fixed submission:
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>   // abs() for float, and fabs()
#include <cstdlib> // abs() for integer
#include <functional>
#include <iomanip>
#include <iostream>
#include <map> // pair
#include <math.h>
#include <numeric>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>
typedef std::stack<int> IntStack;
typedef std::stack<char> charStack;
#define START 0
#define FORWARD 1
#define BACK 2
using namespace std;
using ll = long long;
typedef pair<ll, ll> pll;
bool comp(const pll &a, const pll &b) { return a.first < b.first; }
//*********************************************************
// 最大公約数（Greatest Common Divisor）を返す。
// 引数に０がある場合は０を返す。
//*********************************************************
ll gcd(ll a, ll b) {
  ll tmp, r;
  if (a < b) {
    tmp = a;
    a = b;
    b = tmp;
  }

  /* ユークリッドの互除法 */
  r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  return b;
  //// 引数に０がある場合は０を返す
  // if ((0 == m) || (0 == n))
  //	return 0;

  //// ユークリッドの方法
  // while (m != n)
  //{
  //	if (m > n) m = m - n;
  //	else         n = n - m;
  // }
  // return m;
} // gcd

int main() {
  ll a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, ans = 0;
  ll x[100004] = {};
  ll y[100004] = {};
  ll z[25000001] = {};
  vector<tuple<ll, ll>> vec;
  string s;
  string t;
  // IntStack yStack;
  // charStack Stack;
  // vector<pair<int, int> > pairs(a);
  // cout << LLONG_MAX<< endl;

  cin >> a;
  for (int i = 0; i < 3; i++) {
    cin >> x[i];
  }
  for (int i = 0; i < 3; i++) {
    cin >> y[i];
  }
  z[0] = a;
  for (int k = 0; k < 3; k++) {
    for (int i = 0; i <= a; i++) {
      if (i >= x[k] && x[k] < y[k]) {
        z[i] = max(z[i], z[i - x[k]] + (y[k] - x[k]));
      }
    }
  }
  for (int i = 0; i <= a; i++) {
    ans = max(ans, z[i]);
  }
  z[0] = ans;
  for (int k = 0; k < 3; k++) {
    for (int i = 0; i <= ans; i++) {
      if (i >= y[k] && x[k] > y[k]) {
        z[i] = max(z[i], z[i - y[k]] + (x[k] - y[k]));
      }
    }
  }

  // for (int i = 0; i <= a; i++)
  //{
  //	cout << z[i] << endl;

  //}

  // cout << endl;
  b = ans;
  for (int i = 0; i <= b; i++) {
    ans = max(ans, z[i]);
  }
  cout << ans << endl;

  ////std::cout << std::fixed;
  // cout << std::setprecision(20) << << endl;
  // cout << d+1 << endl;
  // cout << "" << endl;

  return 0;
}
// sort(x, x + a, std::greater<ll>());

// char型の文字数字は、-'0'で数値に変換できる
// accumulate(x, x + a, 0);//int型までの配列の合計
// memcpy(x, visited, sizeof(ll)*n);
// void kansuu(ll num, ll visited[10]) {}
// kansuu(1, zz);
// cout << setprecision(15) << v << endl;
// cout << char(z - 'a');
// log10(i) + 1 //10進数の桁数を取得
//
// int temp;
// for (int i = 0; i < n - 1; i++) {
//	for (int j = n - 1; j > i; j--) {
//		if (w[j - 1] < w[j]) {  /* 前の要素の方が大きかったら */
//			temp = w[j];        /* 交換する */
//			w[j] = w[j - 1];
//			w[j - 1] = temp;
//		}
//	}
// }
//
// 最小公倍数
// ll x = a * b;
// ll tmp;
///* 自然数 a > b を確認・入替 */
// if (a<b) {
//	tmp = a;
//	a = b;
//	b = tmp;
// }
///* ユークリッドの互除法 */
// ll r = a % b;
// while (r != 0) {
//	a = b;
//	b = r;
//	r = a % b;
// }
// a = x / b;//答え

/*vector<pair<ll, ll> > hoges(a);
for (int i = 0; i < a; i++)
{
cin >> x[i];
cin >> y[i];
hoges[i] = make_pair(x[i], y[i]);
}
sort(hoges.begin(),hoges.end(),comp);
for (int i = 0; i < a; i++)
{
if (hoges[i].second>=b)
{
ans += hoges[i].first*b;
break;
}
else
{
ans += hoges[i].first*hoges[i].second;
b -= hoges[i].second;

}
}*/