#include <iostream>
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cstring>
#include <deque>
#include <functional>
#include <initializer_list>
#include <math.h>
#include <map>
#include <set>
#include <stack>
#include <tuple>
#include <queue>
#include <vector>

#define FOR(i, a, b) for(int (i) = (a); (i) < (b); ++(i))
#define rFOR(i, a, b) for(int (i) = (b); (i) >= (a); --(i))
#define REP(i, n) FOR(i, 0, n)
#define rREP(i, n) rFOR(i, 0, (n-1))
#define SORT(A) std::sort((A).begin(), (A).end())
#define ALL(A) (A).begin(), (A).end()
// 座標圧縮 (for vector) : ソートしてから使うのが一般的 ; SORT(A) => COORDINATE_COMPRESSION(A)
#define COORDINATE_COMPRESSION(A) (A).erase(unique((A).begin(),(A).end()),(A).end())

using lli = long long int;
using pii = std::pair<int, int>;

void VintOut(std::vector<int>& A){
    const int n = A.size();
    if(n == 0){putchar('\n'); return;}
    printf("%d", A[0]);
    for(int i = 1; i < n; ++i) printf(" %d", A[i]);
    putchar('\n');
}
void VintOut(std::vector<long long int>& A){
    const int n = A.size();
    if(n == 0){ putchar('\n'); return;}
    printf("%lld", A[0]);
    for(int i = 1; i < n; ++i) printf(" %lld", A[i]);
    putchar('\n');
}

template <typename T>
inline bool chmin(T& a, T b){
    if(b < a){ a = b; return true;}
    return false;
}

template <typename T>
inline bool chmax(T& a, T b){
    if(a < b){ a = b; return true;}
    return false;
}

inline bool bitUP(int state, int k){ return (state >> k) & 1; }
inline bool bitUP(long long int state, int k){ return (state >> k) & 1;}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



lli solve(lli N, std::pair<lli, lli> g, std::pair<lli, lli> s, std::pair<lli, lli> b){
    lli res = 0;
    lli gP, gA; std::tie(gP, gA) = g;
    lli sP, sA; std::tie(sP, sA) = s;
    lli bP, bA; std::tie(bP, bA) = b;
    if(gP < gA){ // 金の交換をすべき
        for(lli usedForGold = 0; usedForGold <= N; usedForGold += gP){ // 金の交換を全探索
            // 金の交換で得られる収入
            lli gainFromGold = (usedForGold / gP) * (gA - gP);
            if(sP < sA){
                if(bP < bA){ // 銀と銅の交換条件を全探索
                    for(lli usedForSilver = 0; usedForGold + usedForSilver <= N; usedForSilver += sP){
                        lli usedForBronze  = N - (usedForSilver + usedForGold);
                        lli gainFromSilver = (usedForSilver / sP) * (sA - sP);
                        lli gainFromBronze = (usedForBronze / bP) * (bA - bP);
                        chmax(res, gainFromGold + gainFromSilver + gainFromBronze);
                    }
                }
                else{ // 余ったものは全て銀の交換に回すべき
                    lli gainFromSilver = (N - usedForGold) / sP * (sA - sP);
                    chmax(res, gainFromGold + gainFromSilver);
                }
            }
            else{ // 銀の交換に回すべきでない
                if(bP < bA){ // 余ったものは全て銅の交換に回すべき
                    lli gainFromBronze = (N - usedForGold) / bP * (bA - bP);
                    chmax(res, gainFromGold + gainFromBronze);
                }
                // 銀と銅は交換に回すべきでない
                else{
                    chmax(res, N / gP * (gA - gP));
                    break;
                }
            }
        }
    }
    else{ // 金を交換に回すべきでない
        if(sP < sA){ // 銀は交換すべき

            if(bP < bA){ // 銅は交換すべき
                for(lli usedForSilver = 0; usedForSilver <= N; usedForSilver += sP){
                    lli usedForBronze  = N - usedForSilver;
                    lli gainFromSilver = usedForSilver / sP * (sA - sP);
                    lli gainFromBronze = usedForBronze / bP * (bA - bP);
                    chmax(res, gainFromSilver + gainFromBronze);
                }
            }
            else // 銅は交換すべきでない
                chmax(res, N / sP * (sA - sP));
        }
        else{ // 銀は交換すべきでない
            if(bP < bA){
                chmax(res, N / bP * (bA - bP));
            }
            else // どれも交換すべきでない
            ;
        }
    }
    return res;
}


int main(void){
    long long int n; scanf("%lld", &n);
    int ga, sa, ba; scanf("%d%d%d", &ga, &sa, &ba);
    int gb, sb, bb; scanf("%d%d%d", &gb, &sb, &bb);
    
    // 1, Aで換金 -> Bでどんぐりに戻す              | x -> (x / ga) * (gb - ga) 増加
    // 2, Bで換金 -> Aに戻ってきた時にどんぐりに戻す  | x -> (x / gb) * (ga - gb) 増加
    // 1 の場合はシルバーなど他の場合に得た収入を2で活かすことができてしまう
    
    n += solve(n, {ga, gb}, {sa, sb}, {ba, bb});


    n += solve(n, {gb, ga}, {sb, sa}, {bb, ba});
    printf("%lld\n", n);
    



    
    return 0;
}

Measured memory_bytes: 504