[백준] Baekjoon Online Judge
문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
예제 입력 | 예제 출력 |
5 0 -7 -3 -2 5 8 |
1 |
풀이
#include <iostream>
using namespace std;
int N, S, cnt = 0;
int num[20];
void dfs(int dth, int result, int now);
void dfs(int dth, int result, int now) {
if (result == S && dth > 0) cnt++;
if (dth == N) return;
for (int i = now; i < N; i++)
dfs(dth + 1, result + num[i], i + 1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> S;
for (int i = 0; i < N; i++) cin >> num[i];
dfs(0, 0, 0);
cout << cnt << '\n';
return 0;
}
void dfs(int dth, int result, int now) {
if (result == S && dth > 0) cnt++;
if (dth == N) return;
for (int i = now; i < N; i++)
dfs(dth + 1, result + num[i], i + 1);
}
백트래킹을 하며 만든 부분수열의 합 result가 S와 같아지면 cnt를 1 증가시키는 방식으로 합이 S가 되는 부분수열의 개수를 구했다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 10974번 - 모든 순열 (0) | 2023.07.27 |
---|---|
[Baekjoon/C++] 1541번 - 잃어버린 괄호 (0) | 2023.07.21 |
[Baekjoon/C++] 15658번 - 연산자 끼워넣기 (2) (0) | 2023.07.19 |
[Baekjoon/C++] 15665번 - N과 M (11) (0) | 2023.07.17 |
[Baekjoon/C++] 15664번 - N과 M (10) (0) | 2023.07.16 |