본문 바로가기

알고리즘(C++)/백준 알고리즘

[백준] C++ 2798번 : 블랙잭

풀이과정


카드의 개수(N)카드 3장 합의 최대값(M)을 입력받는다.

 

카드의 숫자를 저장한 벡터(v)와 고른 카드의 숫자를 더한 값(sum), 현재 인덱스(index), 더한 횟수(cnt)를 재귀함수의 인자로 받는다.

 

더한 횟수가 3이고 sum 이 입력받은 M보다 작거나 같을 때, 

 

카드 3장의 합 최대값을 저장한 변수(iMax)와 비교해서 sumiMax보다 크다면 iMaxsum의 값을 대입한다.

 

현재 인덱스에 해당하는 카드를 선택한다면 AddValue(v, sum + v.at(index), index + 1, cnt + 1);indexcnt를 1만큼 증가시켜주고 sum현재 인덱스가 가르키는 카드 값( v.at(index) )를 넣어준다.

 

현재 인덱스에 해당하는 카드를 선택하지 않는다면 AddValue(v, sum, index + 1, cnt);index만 1만큼 증가시켜주고 sumcnt는 증가하지 않는다.

코드


더보기
#include <iostream>
#include <vector>

using namespace std;

int iSize = 0, iMaxValue = 0;
int iMax = 0;

void AddValue(vector<int> v, int sum, int index, int cnt)
{
	if (cnt == 3 && sum <= iMaxValue)
	{
		if (iMax < sum)
			iMax = sum;
	}
	if (index >= iSize || cnt > 3 || sum > iMaxValue) return;

	AddValue(v, sum + v.at(index), index + 1, cnt + 1);

	AddValue(v, sum, index + 1, cnt);
}

int main()
{
	vector<int> v;

	cin >> iSize >> iMaxValue;

	v.reserve(iSize);

	for (int i = 0; i < iSize; ++i)
	{
		int i2 = 0;
		cin >> i2;

		v.push_back(i2);
	}

	AddValue(v, 0, 0, 0);
	cout << iMax << endl;
	return 0;
}