1. O(2^N) - 1
2. 공집합은 카운트를 하면 안된다. (S == 0)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
import java.io.*; | |
/** | |
* https://www.acmicpc.net/problem/1182 | |
* BOJ 백준온라인져지 1182 부분집합의 합 풀이 | |
*/ | |
public class Main { | |
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); | |
private static int arr[]; | |
private static int N, S, result = 0; | |
public static void main(String args[]) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
String str1[] = br.readLine().split(" "); | |
N = Integer.parseInt(str1[0]); | |
S = Integer.parseInt(str1[1]); | |
String str2[] = br.readLine().split(" "); | |
arr = new int[N]; | |
for (int i = 0; i < N; i++) { | |
arr[i] = Integer.parseInt(str2[i]); | |
} | |
bruteforce(0, 0, 0); | |
bw.write(String.valueOf(result)); | |
bw.flush(); | |
} | |
private static void bruteforce (int sum, int i, int check) { | |
if (i == N) { | |
if (sum == S && check > 0) result++; | |
return; | |
} | |
bruteforce(sum + arr[i], i + 1, check + 1); | |
bruteforce(sum, i + 1, check); | |
} | |
} |
문제
N개의 정수로 이루어진 집합이 있을 때, 이 집합의 공집합이 아닌 부분집합 중에서 그 집합의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1≤N≤20, |S|≤1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절대값은 100,000을 넘지 않는다. 같은 수가 여러번 주어질 수도 있다.
출력
첫째 줄에 합이 S가 되는 부분집합의 개수를 출력한다.
예제 입력 1
5 0 -7 -3 -2 5 8
예제 출력 1
1
힌트
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 3047 ABC 풀이 (0) | 2018.05.16 |
---|---|
BOJ 백준온라인져지 14501 퇴사 풀이 (0) | 2018.05.15 |
BOJ 백준온라인져지 1654 랜선 자르기 풀이 (0) | 2018.05.14 |
BOJ 백준온라인져지 14627 파닭파닭 풀이 (0) | 2018.05.14 |
BOJ 백준온라인져지 7785 회사에 있는 사람 풀이 (0) | 2018.05.11 |