티스토리 뷰

문제

BOJ 1208 부분집합의 합 2

klimmek55 2018. 4. 3. 14:25

부분집합의 합 2

(http://boj.kr/1208)



부분집합의 합 문제는 \(N\)의 제한이 \(20\)이기 때문에 모든 부분집합을 구하는 \(2^N\)의 방법으로도 풀 수 있었다.

하지만 이 문제는 \(N\)의 제한이 \(40\)이기 때문에 같은 방법으로는 풀 수 없다.


풀이부터 말하자면,

배열을 반으로 나눠서 \(A\)와 \(B\)라고 했을 때,

\(A\)의 부분집합의 합이 \(S\)가 되는 경우 + \(A\)와 \(B\)의 부분집합의 합이 \(S\)가 되는 경우 + \(B\)의 부분집합의 합이 \(S\)가 되는 경우를 구해야 한다.

앞의 경우와 뒤의 경우는 그냥 구하면 \(2\times 2^{\frac{N}{2}}\)만에 구할 수 있고,

가운데의 경우를 구하기 위해서는 \(A\)와 \(B\)를 합쳐야 한다.


처음에는 \(A\)에서 나오는 합을 센다. 그 다음에 \(B\)의 합을 구하면서 (\(S\) - 합)이 \(A\)에서 몇 번 있었는지를 확인하면 쉽게 구할 수 있다.



처음에는 dp처럼 d[i][j] = d[i - 1][j] + d[i - 1][s - arr[i]]의 방법으로 풀려고 했는데, 메모리가 부족했다.

더 좋은 방법이 생각 안 나서 풀이를 찾아 봤는데, 반으로 나눈다는 방법으로 시간을 훨씬 줄일 수 있다는 것이 신기했다.

냅색문제와 매우 비슷하다.





'문제' 카테고리의 다른 글

BOJ 14868 문명  (0) 2018.04.08
BOJ 14867 물통  (0) 2018.04.07
BOJ 3108 로고  (0) 2018.04.01
BOJ 14657 준오는 최종인재야!!  (0) 2018.03.26
BOJ 1517 버블 소트  (0) 2018.03.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함