Algorithm

백준_부분수열의 합_14225

Young_J 2021. 1. 25. 23:20

// 알고리즘

 

1. 부분집합

 

2. check배열을 나올 수 있는 최대 수인 2000000 생성

 

3. 주어진 수의 부분집합을 구해 모두 더해서 check 배열에 표시

 

4. check배열을 1부터 시작하여 false인 값이 정답

더보기
import java.io.*;
import java.util.*;

public class 부분수열의합_14225 {

	static int N, arr[], ans;
	static boolean[] v;
	static boolean[] check;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		v = new boolean[N];
		check = new boolean[2000001];
		arr = new int[N];
		ans = 0;

		for (int i = 0; i < N; i++) {
			arr[i] = sc.nextInt();
		}

		cal(0);
		
		for (int i = 1; i <= 2000000; i++) {
			if(!check[i]) {
				System.out.println(i);
				break;
			}
		}

	}

	private static void cal(int idx) {
		if (idx == N) {
			
			int cnt = 0;
			for (int i = 0; i < N; i++) {
				if(v[i]) cnt+=arr[i];
			}
			
			check[cnt] = true;
			
			return;
		}

		v[idx] = true;
		cal(idx + 1);
		v[idx] = false;
		cal(idx + 1);

	}

}

※ n값이 20이라고 주어졌을 때, 부분집합의 개수가 2의 20승 이므로(백만)  부분집합으로 풀 수 있는 문제라고 생각

이후에는 그냥 쉽게 구현만 해서 정답이 나옴.