🖥️ CS/Baekjoon Algorithms

#1182번 부분수열의 합 (C++)

한국의 메타몽 2021. 2. 24. 03:07

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

 

1182번: 부분수열의 합

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

www.acmicpc.net

전형적인 백 트래킹 문제로, 자세한 해설은 해설하겠다.

한 가지 눈 여겨 볼 점은 'if(s==0) ans-=1' 부분인데, 

문제에서 크기가 양 수인 부분 수열, 즉, 최소 1개 이상의 원소를 갖는 부분 집합을 가져야 한다는 것을 언급했다.

아무것도 집합을 만들지 않으면 자동으로 0이 나오는데, 만약 s=0인 경우 이 상황을 고려해서 -1을 해줘야한다.

 

#include <iostream>
using namespace std;

int n=0, s=0, ans = 0;
int v[21];
void dfs(int index, int sum){
    if(index==n){
        if(sum==s) ans++;
        return;
    }
    dfs(index+1,sum+v[index]);
    dfs(index+1,sum);
}

int main(void) {
    cin >> n >> s;
    for(int i=0; i<n; i++){
        cin >> v[i];
    }
    dfs(0,0);
    if(s==0) ans-=1;
    cout << ans << "\n";
   return 0;
}

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#14500번 테트로미노 (C++)  (0) 2021.03.02
#14225번 부분수열의 합 (C++)  (0) 2021.02.24
#17427번 약수의 합2 (C++)  (0) 2021.02.24
#4375번 1 (C++)  (0) 2021.02.23
#15661번 링크와 스타트 (C++)  (0) 2021.02.15