본문 바로가기

Algorithm/DFS

(C++) - 백준(BOJ) 1182번 : 부분수열의 합

반응형

문제링크 : https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

조합으로 뽑았을 때

부분수열들이 중복될 경우도 고려했었는데 그런걸 고려하는 문제가 아닙니다

 

문제입력 :

4 16

1 7 9 9

output : 2

3번째 9와 2번째 7 뽑는것과 4번째 9와 2번째 7을 뽑는것은 다르다고 보는 것 같습니다. 요거 몰라서 고생했습니다..낄낄

 

마찬가지의 테스트 케이스입니다.

문제입력 :

2 0

0 0

output : 3

(0) , (0) , (0,0) 1번째 0 뽑는경우 2번째 0뽑는경우 1번째와 2번째 뽑는경우 이렇게 3경우가 있습니다.

 

풀이방법

1. 자기 자신은 안뽑는다.

2. 체크안되어있으면 체크 후 해당 노드를 현재 depth에 넣는다.

2. 다음노드에서 탐색을 시작할 때 이전에 체크해두었던 노드를 체크해제한다.

 

Code

#include <iostream>
#include <algorithm>
using namespace std;
int n,s,answer;
int tmp[21], ck[21], num[21];
int dfs(int depth,int index,int m) {
	int sum = 0;
	if (depth == m){
		for (int i = 0; i < m; i++) sum += tmp[i];
		return sum==s;
	}

    int ans = 0;
	for (int i = index; i < n; i++){
		if (!ck[i] ){
			ck[i] = 1;
			tmp [depth]= num[i];
			ans += dfs(depth + 1, i + 1,m);
			ck[i] = 0;
		}
	}
    
    return ans;
}

int main() {
	cin >> n >> s;
	for (int i = 0; i < n; i++) cin >> num[i];
	for(int i = 0; i < n; i++) answer += dfs(0, 0, i + 1);
	cout << answer << '\n';
}​

'Algorithm > DFS' 카테고리의 다른 글

(C++) - 백준(BOJ) 9663번 : N-Queen 답  (0) 2020.02.01
(C++) - 백준(BOJ) 1039번 : 교환  (0) 2020.01.16
(C++) - DFS 유형  (0) 2020.01.15
(C++) - 백준(BOJ) 15664번 : N과 M (10)  (0) 2019.09.28
(C++) - 백준(BOJ) 15663번 : N과 M (9)  (0) 2019.09.28