문제출처 : https://www.acmicpc.net/problem/1182
1. 문제요약
- 집합, N개의 원소, 부분집합의 합이 S를 만족시키는 경우의 수
- N < 20, lSl < 1,000,000, l원소l < 100,000
- 공집합은 제외
2. 접근방법
- 부분집합의 개수는 2^N = 2^20 ≒ 1억번 ≒ 1초
- 모든 부분집합의 합을 다 구해보면 된다.
3. 시간복잡도
- 재귀 : 2^N => 테스트 결과 4ms
- Bit Mask : 2^N * N => 테스트 결과 52ms
4. 회고
- 재귀로 구현했을 때
: 공집합인지 확인하는 과정이 필요함. S의 값이 0인 경우 공집합의 합은 0 이므로
: 처음에는 선택한 원소의 개수도 재귀로 넘겼는데 S가 0이 아닌 경우는 공집합을 포함해도 경우의 수에 포함 되지 않으므로
마지막에 계산할 때, S가 0인 경우 1가지 경우의 수를 빼주면 됨.
- Bit Mask로 구현했을 때
: 좀 더 구현에 연습이 필요함
재귀 소스코드
Bit Mask 소스코드
[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]
'먹고살려면 > boj' 카테고리의 다른 글
BOJ 1966 프린터 큐 (0) | 2017.12.26 |
---|---|
BOJ 7568 덩치 (0) | 2017.12.19 |
BOJ 6603 로또 (0) | 2017.12.19 |
BOJ 2309 일곱난쟁이 (0) | 2017.12.13 |
BOJ 1065 한수 (0) | 2017.12.12 |