GitHubSeob
C++ / 백준 / 1182 / 부분수열의 합 본문
문제
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
문제풀이
다음칸을 선택, 선택하지 않는 경우인 두 경우를 나누어 DFS함수를 실행시킨다.
선택한다면 visit함수에 push_back으로 해당 idx번째 값을 넣어준다.
idx가 N-1이 되었다면 visit벡터의 값들의 합을 구해 S와 같은지를 비교한다.
모두 선택하지 않는 경우는 개수에 포함이 안되므로 visit의 size가 0이 아닐 때라는 조건을 걸어둔다.
코드
#include <iostream>
#include <vector>
using namespace std;
int N, S;
vector<int>seq;
vector<int>visit;
int answer;
void DFS(int idx) {
int idx2(0);
if (idx == N - 1 && visit.size() != 0) {
int sum(0);
for (idx2 = 0; idx2 < visit.size(); ++idx2)
sum += visit[idx2];
if (sum == S) ++answer;
return;
}
if (idx + 1 < N) {
visit.push_back(seq[idx + 1]);
DFS(idx + 1);
visit.pop_back();
DFS(idx + 1);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> S;
int idx(0);
seq = vector<int>(N, 0);
for (idx = 0; idx < N; ++idx)
cin >> seq[idx];
DFS(0);
visit.push_back(seq[0]);
DFS(0);
cout << answer;
}
'Baekjoon > Silver' 카테고리의 다른 글
C++ / 백준 / 1406 / 에디터 (0) | 2021.10.26 |
---|---|
C++ / 백준 / 2003 / 수들의 합 2 (0) | 2021.10.03 |
C++ / 백준 / 6603 / 로또 (0) | 2021.10.03 |
C++ / 백준 / 3184 / 양 (0) | 2021.09.24 |
C++ / 백준 / 2251 / 물통 (0) | 2021.09.18 |