https://www.acmicpc.net/problem/14225
14225번: 부분수열의 합
수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들
www.acmicpc.net
문제
수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오.
예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들 수 있다. 하지만, 4는 만들 수 없기 때문에 정답은 4이다.
입력
첫째 줄에 수열 S의 크기 N이 주어진다. (1 ≤ N ≤ 20)
둘째 줄에는 수열 S가 주어진다. S를 이루고있는 수는 100,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> getNum;
bool check[2000001];
void Recur(int count, int sum)//재귀적으로 부분수열의 합을 탐색할 함수
{
check[sum] = true;
if (count == N)
return;
Recur(count + 1, sum);
Recur(count + 1, sum+getNum[count]);
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
int n;
cin >> n;
getNum.push_back(n);
}
Recur(0, 0);
for (int i = 1; i < 2000000; i++)//처음부터 시작해서 체크안한 가장 작은 수 출력
{
if (!check[i])
{
cout << i;
break;
}
}
}
'백준 c++ > (2-1)백준 c++ 알고리즘 중급' 카테고리의 다른 글
백준 16198 c++ 에너지 모으기 (1) | 2023.01.27 |
---|---|
백준 16197 c++ 두 동전 (0) | 2023.01.26 |
백준 15658 c++ 연산자 끼워넣기(2) (0) | 2023.01.25 |
백준 14888 c++ 연산자 끼워넣기 (0) | 2023.01.20 |
백준 1339 c++ 단어 수학 (0) | 2023.01.19 |