BAEKJOON ONLINE JUDGE
1182 부분집합의 합
https://www.acmicpc.net/problem/1182
![](https://t1.daumcdn.net/cfile/tistory/2465C74A57F273190A)
주의
정수 S가 0인 경우 공집합도 개수를 세도록 구현했다면 이를 빼주어야 한다.
13분
1. DFS
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 32 33 34 35 | #include <stdio.h> int n, s; int number[21]; int count; void dfs(int idx, int sum) { if (idx >= n) { if (sum == s) count++; return; } dfs(idx + 1, sum); dfs(idx + 1, sum + number[idx]); } int main() { int i; scanf("%d %d", &n, &s); for (i = 0; i < n; i++) { scanf("%d", &number[i]); } dfs(1, 0); dfs(1, number[0]); if (s == 0) count--; printf("%d\n", count); return 0; } | cs |
2. BFS
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <cstdio> #include <queue> using namespace std; int n, s; int number[21]; queue<pair<int, int> > que; int bfs() { int cnt = 0; que.push(make_pair(1, 0)); que.push(make_pair(1, number[0])); while (!que.empty()) { int idx = que.front().first; int sum = que.front().second; que.pop(); if (idx == n && sum == s) cnt++; if (idx < n) { que.push(make_pair(idx + 1, sum)); que.push(make_pair(idx + 1, sum + number[idx])); } } if (s == 0) cnt--; return cnt; } int main() { int i; scanf("%d %d", &n, &s); for (i = 0; i < n; i++) { scanf("%d", &number[i]); } printf("%d\n", bfs()); return 0; } | cs |