알고리즘
BOJ [1182] 부분집합의 합
감동이중요해
2017. 8. 31. 19:28
https://www.acmicpc.net/problem/1182
1. 분류
브루트 포스, 비트마스크
2. 풀이
N개의 원소를 갖는 집합에서 합이 S인 부분집합의 개수를 세는 문제.
부분집합은 2^N개만큼 존재한다.
부분집합을 구하는 방법은 여러 가지가 있겠지만 나는 비트연산을 이용했다.
A, B, C를 갖는 집합의 부분집합을 표로 그려보면 다음과 같다.
정수 |
이진수 |
부분집합 |
0 |
000 |
|
1 |
001 |
A |
2 |
010 |
B |
3 |
011 |
A B |
4 |
100 |
C |
5 |
101 |
A C |
6 |
110 |
B C |
7 |
111 |
A B C |
위 사실만 알면 부분집합을 구하는 건 다 한 것이다.
정수 0부터 2^N - 1까지 반복문, 그 안에 원소의 개수(N)개만큼 도는 반복문.
그리고 반복문 두 개의 인덱스를 AND연산하면 부분집합을 구해낼 수 있다.
3. 소스코드
#include <cstdio> int main() { int n, s, cnt = 0, a[25] = { 0 }; scanf("%d %d", &n, &s); for (int i = 0; i < n; i++) scanf("%d", &a[i]); for (int i = 1; i < (1 << n); i++) { int sum = 0; for (int j = 0; j < n; j++) { if (i & (1 << j)) sum += a[j]; } if (sum == s) cnt++; } printf("%d\n", cnt); return 0; }