BOJ

백준 1182 - 부분수열의 합

yanJuicy 2019. 6. 29. 16:04
반응형

문제

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

 

1182번: 부분수열의 합

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

www.acmicpc.net

 

풀이

부분수열은 연속적인 부분수열을 의미하는 것이 아니었다. 1, 2, 3, 4의 수열이 있으면 (1, 4), (1, 3, 4) 같이 떨어져 있어도 부분수열이 된다. 이것 때문에 헷갈린 문제다. 

 

배열 각각의 원소를 포함하거나 포함하지 않거나의 2가지 경우로 배열의 모든 인덱스를 탐색하면 된다. 길이가 최대 20이므로 최대 2^20번의 경우가 나온다. 재귀 함수를 이용하면 간단히 풀 수 있다. 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
using namespace std;
 
int N, S;
int arr[20];
int num;
 
void f(int arr[], int S, int start, int result)
{
    if (result == S) num++;
    for (int i = start + 1 ; i < N; i++) f(arr, S, i, result + arr[i]);
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> N >> S;
 
    for (int i = 0; i < N; i++cin >> arr[i];
 
    for (int i = 0; i < N; i++)
        f(arr, S, i, arr[i]);
 
    cout << num;
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 13904 - 과제  (1) 2019.07.02
백준 2212 - 센서  (1) 2019.06.30
백준 1699 - 제곱수의 합  (0) 2019.06.25
백준 2294 - 동전 2  (0) 2019.06.24
백준 1935 - 후위표기식2  (0) 2019.06.11