본문 바로가기
알고리즘 문제

[알고리즘 문제] 백준2798 - 블랙잭

by 박연호의 개발 블로그 2020. 8. 22.

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 ��

www.acmicpc.net

입력으로 받은 숫자중에서 3개를 뽑아서 그 합이 최대값을 넘지 않는선에서 최대값을 구하는 문제이다.

앞선 문제 난쟁이 문제와 같이 3개의 카드를 뽑는데 재귀를 사용하였다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> cards;
vector<int> temp;
int visited[101];
int answer = -1;
int M, N; // 카드개수, max

int getCardSum()
{
    int sum = 0;
    for (int i = 0; i < temp.size(); i++)
    {
        sum += temp[i];
    }
    return sum;
}

void search()
{
    if (temp.size() == 3)
    {
        int n = getCardSum();
        if (n <= N)
        {
            answer = max(answer, n);
        }
        return;
    }

    for (int i = 0; i < cards.size(); i++)
    {
        if (!visited[i])
        {
            visited[i] = true;
            temp.push_back(cards[i]);
            search();
            visited[i] = false;
            temp.pop_back();
        }
    }
}

int main()
{
    cin >> M >> N;
    int n;

    for (int i = 0; i < M; i++)
    {
        cin >> n;
        cards.push_back(n);
    }
    search();
    cout << answer;
}