GitHubSeob

C++ / 백준 / 1182 / 부분수열의 합 본문

Baekjoon/Silver

C++ / 백준 / 1182 / 부분수열의 합

GitHubSeob 2021. 10. 3.

문제

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