[백준]14225 부분 수열의 합

문제

수열 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의 하위 시퀀스의 합이 될 수 없는 가장 작은 자연수를 인쇄합니다.

n번째 숫자가 추가되거나 추가되지 않으면 방문한 숫자가 각각 클리핑되어 표시됩니다.

이후 1번부터 체크하여 처음 방문하지 않은 번호 방문시 출력하고 종료합니다.

	#include<bits/stdc++.h>
	#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL)
	#define mset(v) memset(v,0,sizeof(v));
	#define rep(i,a) for(int i=0;i<a;++i)
	#define REP(i,a) for(int i=1;i<=a;++i)

	using namespace std;

	typedef long long ll;
	typedef pair<int, int> pi;
	typedef tuple<int, int, int>ti;
	typedef vector<int> vi;
	typedef vector<vector<int>> vvi;
	int N, M, n(21), v(21), m(2000001), temp;
	void dfs(int k,int sum) {
		if (k >= N)return;
		m(sum+n(k)) = 1;
		dfs(k + 1, sum);
		dfs(k + 1, sum + n(k));
	}
	int main() {
		FAST;
		int k = 0;
		cin >> N;
		rep(i, N) {
			cin >> n(i);
		}
		dfs(0,0);
		REP(i, 2000001) {
			if (!m(i)) {
				cout << i;
				return 0;
			}
		}
	}