본문 바로가기

백준/실버

[백준 1182번] 부분수열의 합 (C++)

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

 

1182번: 부분수열의 합

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, S, result;
int arr[21];

void dfs(int idx, int sum)
{
    if(idx==N) return;
    if(sum + arr[idx] == S) result++; //누적합 + 현재값이 S면 카운팅

    dfs(idx+1, sum + arr[idx]); //현재 숫자 더하고 넘기기
    dfs(idx+1, sum); //그냥 넘기기
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> N >> S;
    for(int i=0; i<N; i++)
    {
        cin >> arr[i];
    }

    dfs(0, 0);
    cout << result;    
}

 

오랜만에 브루트포스 문제이다.

재귀를 사용하여 현재 숫자 값을 더하고 넘기기와 그냥 넘기기 2개를 돌려준다. (구간별 누적합 체크)

현재까지의 누적합 + 현재 값이 S가 된다면 정답을 추가해주고, idx==N이 되어 전부 탐색하면 종료해준다.

 

 

'백준 > 실버' 카테고리의 다른 글

[백준 9658번] 돌 게임 4 (C++)  (0) 2023.11.20
[백준 1446번] 지름길 (C++)  (0) 2023.11.19
[백준 1965번] 상자넣기 (C++)  (0) 2023.11.15
[백준 14426번] 접두사 찾기 (C++)  (0) 2023.11.12
[백준 15900번] 나무 탈출 (C++)  (0) 2023.11.10