알고리즘

[백준/백트래킹/C++] 1182번 부분수열의 합

데메즈 2023. 1. 7. 15:19
728x90
반응형

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

문제 해결 방법

k를 차례로 증가시키면서 k번째 원소를 합하거나 합하지 않는 두가지 경우로 백트래킹을 한다

#include <bits/stdc++.h>

using namespace std;

int n, s;
int arr[21];
int result = 0;

void backtrack(int k, int tot){
    if(k == n){
        if(tot == s) result++;
        return;
    }
    backtrack(k+1, tot); // k번째 원소를 더하지 않는 경우
    backtrack(k+1, tot+arr[k]); // k번째 원소를 더하는 경우
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> s;
    for(int i=0; i<n; i++){
        cin >> arr[i];
    }

    backtrack(0, 0);

    if(s == 0) result--;
    cout << result;


    return 0;
}

 

참고

https://www.youtube.com/watch?v=Enz2csssTCs&t=3s

728x90
반응형