
풀이과정
카드의 개수(N)과 카드 3장 합의 최대값(M)을 입력받는다.
카드의 숫자를 저장한 벡터(v)와 고른 카드의 숫자를 더한 값(sum), 현재 인덱스(index), 더한 횟수(cnt)를 재귀함수의 인자로 받는다.
더한 횟수가 3이고 sum 이 입력받은 M보다 작거나 같을 때,
카드 3장의 합 최대값을 저장한 변수(iMax)와 비교해서 sum이 iMax보다 크다면 iMax에 sum의 값을 대입한다.
현재 인덱스에 해당하는 카드를 선택한다면 AddValue(v, sum + v.at(index), index + 1, cnt + 1); 로 index와 cnt를 1만큼 증가시켜주고 sum에 현재 인덱스가 가르키는 카드 값( v.at(index) )를 넣어준다.
현재 인덱스에 해당하는 카드를 선택하지 않는다면 AddValue(v, sum, index + 1, cnt); 로 index만 1만큼 증가시켜주고 sum과 cnt는 증가하지 않는다.
코드
더보기
#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;
}
'알고리즘(C++) > 백준 알고리즘' 카테고리의 다른 글
| [백준] C++ 10828번 : 스택 (0) | 2019.11.07 |
|---|---|
| [백준] C++ 1159번 : 농구 경기 (0) | 2019.11.07 |
| [백준] C++ 2953번 : 나는 요리사다 (0) | 2019.11.07 |
| [백준] C++ 3052번 : 나머지 (0) | 2019.11.07 |
| [백준] C++ 2920번 : 음계 (0) | 2019.11.06 |