Language: C++

#include<cstdio>
bool can_use[10];
unsigned best[8];
unsigned cost[10] = {0, 2, 5, 5, 4, 5, 6, 3, 7, 6};

int main(){
    unsigned N, M;
    scanf("%u %u", &N, &M);
    for (size_t i = 0; i < M; i++){
        unsigned tmp;
        scanf("%u", &tmp);
        can_use[tmp] = true;
    }
    for (size_t i = 1; i < 10; i++){
        if(can_use[i]) best[cost[i]] = i;
    }
    if(best[2]){
        if(!(N&1)){
            for (size_t i = 0; i < N>>1; i++){
                printf("1");
            }
            printf("\n");
            return 0;
        }
        //N >= 3
        if(best[3]){
            printf("7");
            for (size_t i = 1; i < N>>1; i++){
                printf("1");
            }
            printf("\n");
            return 0;
        }
        //N >= 5
        if(best[5]){
            printf("%u", best[5]);
            for (size_t i = 2; i < N>>1; i++){
                printf("1");
            }
            printf("\n");
            return 0;
        }
        //N >= 7
        printf("8");
        for (size_t i = 3; i < N>>1; i++){
            printf("1");
        }
        printf("\n");
        return 0;
    }
    if(best[3]){
        //best[6]は使わない。使うのはbest[3], best[4], best[5], best[7]
        if(!(N%3)){
            for (size_t i = 0; i < N/3; i++){
                printf("7");
            }
            printf("\n");
            return 0;
        }
        //N%3 > 0
        if(best[4]){
            //best[7]は使わない。使うのはbest[3], best[4], best[5]
            if(N%3 == 1){
                for (size_t i = 1; i < N/3; i++){
                    printf("7");
                }
                printf("4\n");
                return 0;
            }
            if(best[5]){
                for (size_t i = 1; i < N/3; i++){
                    printf("7");
                }
                printf("%u\n", best[5]);
                return 0;
            }
            for (size_t i = 2; i < N/3; i++){
                printf("7");
            }
            printf("44\n");
            return 0;
        }
        //使うのはbest[3], best[5], best[7]
        if(N%3 == 1){
            if(best[7]){
                printf("8");
                for (size_t i = 2; i < N/3; i++){
                    printf("7");
                }
                printf("\n");
                return 0;
            }
            for (size_t i = 3; i < N/3; i++){
                printf("7");
            }
            printf("%u%u\n", best[5], best[5]);
            return 0;
        }
        if(best[5]){
            for (size_t i = 1; i < N/3; i++){
                printf("7");
            }
            printf("%u\n", best[5]);
            return 0;
        }
        printf("88");
        for (size_t i = 4; i < N/3; i++){
            printf("7");
        }
        printf("\n");
        return 0;
    }
    if(best[4]){
        if(!(N&3)){
            for (size_t i = 0; i < N>>2; i++){
                printf("4");
            }
            printf("\n");
            return 0;
        }
        if(!(N&1)){
            //N%4 == 2
            if(best[6]){
                //best[6] > 0なのでbest[6] > best[5], best[6] > best[4]が成り立つ
                printf("%u", best[6]);
                for (size_t i = 1; i < N>>2; i++){
                    printf("4");
                }
                printf("\n");
                return 0;
            }
            if(best[5]){
                if(best[5] > 4) printf("55");
                for (size_t i = 2; i < N>>2; i++){
                    printf("4");
                }
                if(best[5] < 4) printf("%u%u", best[5], best[5]);
                printf("\n");
                return 0;
            }
            printf("88");
            for (size_t i = 3; i < N>>2; i++){
                printf("4");
            }
            printf("\n");
            return 0;
        }
        if(!(N&2)){
            //N%4 == 1
            if(best[5]){
                if(best[5] > 4) printf("5");
                for (size_t i = 1; i < N>>2; i++){
                    printf("4");
                }
                if(best[5] < 4) printf("%u", best[5]);
                printf("\n");
                return 0;
            }
            //best[7] == 8 (> 0)
            if(best[6]){
                if(best[6] > 8) printf("%u", best[6]);
                printf("8");
                if(best[6] < 8) printf("%u", best[6]);
                for (size_t i = 3; i < N>>2; i++){
                    printf("4");
                }
                printf("\n");
                return 0;
            }
            printf("888");
            for (size_t i = 5; i < N>>2; i++){
                printf("4");
            }
            printf("\n");
            return 0;
        }
        //N%4 == 3
        //3 == 1 + 1 + 1 == 1 + 2
        if(best[7]){
            if(best[6] > best[7] && best[5] && N > 7){
                printf("9");
                if(best[5] > 4) printf("5");
                for (size_t i = 2; i < N>>2; i++){
                    printf("4");
                }
                if(best[5] < 4) printf("%u", best[5]);
                printf("\n");
                return 0;
            }
            printf("8");
            for (size_t i = 1; i < N>>2; i++){
                printf("4");
            }
            printf("\n");
            return 0;
        }
        if(best[6]){
            printf("%u", best[6]);
            if(best[5] > 4) printf("5");
            for (size_t i = 2; i < N>>2; i++){
                printf("4");
            }
            if(best[5] < 4) printf("%u", best[5]);
            printf("\n");
            return 0;
        }
        if(best[5] > 4) printf("555");
        for (size_t i = 3; i < N>>2; i++){
            printf("4");
        }
        if(best[5] < 4) printf("%u%u%u", best[5], best[5], best[5]);
        printf("\n");
        return 0;
    }
    if(best[5]){
        if(!(N%5)){
            for (size_t i = 0; i < N/5; i++){
                printf("%u", best[5]);
            }
            printf("\n");
            return 0;
        }
        if(best[7] > best[6]){
            for (size_t i = 0; i < N%5>>1; i++){
                printf("8");
            }
            for (size_t i = 0; i < N%5&1; i++){
                printf("6");
            }
            for (size_t i = (N%5>>1) + (N%5&1); i < N/5; i++){
                printf("%u", best[5]);
            }
            printf("\n");
            return 0;
        }
        unsigned seven = max(0, (int)N%5 - (int)N/5);
        for (size_t i = 0; i < N%5 - seven*2; i++){
            printf("%u", best[6]);
        }
        for (size_t i = 0; i < seven; i++){
            printf("8");
        }
        for (size_t i = N%5 - seven; i < N/5; i++){
            printf("%u", best[5]);
        }
        printf("\n");
        return 0;
    }
    if(best[6]){
        if(best[7] > best[6]){
            for (size_t i = 0; i < N%6; i++){
                printf("8");
            }
        }
        for (size_t i = N%6; i < N/6; i++){
            printf("%u", best[6]);
        }
        if(best[7] < best[6]){
            //best[7] == 0ならN%6 == 0
            for (size_t i = 0; i < N%6; i++){
                printf("8");
            }
        }
        printf("\n");
        return 0;
    }
    for (size_t i = 0; i < N/7; i++){
        printf("8");
    }
    printf("\n");
	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:236:26: error: 'max' was not declared in this scope
  236 |         unsigned seven = max(0, (int)N%5 - (int)N/5);
      |                          ^~~