SDJ( 수돈재 아님 ㅎ )

[C++] 1182 - 부분수열의 합 본문

알고리즘/Backjoon

[C++] 1182 - 부분수열의 합

ShinDongJun 2019. 12. 15. 15:36

문제 링크 : 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
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
31
32
33
34
35
36
37
38
#include<iostream>
#include<algorithm>
#define endl '\n'
 
using namespace std;
 
int S[25];
int N, K;
int cnt;
 
int search(int e, int value, int t)
{
    if(value == K)
        cnt++;
    
    for(int i = e+1; i < N; ++i)
        search(i, value+S[i], t+1);
    
    return 0;
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> N >> K;
    for(int i = 0; i < N; ++i)
        cin >> S[i];
 
    for(int i = 0; i < N; ++i)
        search(i, S[i], 0);
 
    cout << cnt << endl;
 
    return 0;
}

 

O(2^N)이기때문에 다른 방법을 찾아봐야한다.

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

 

1208번: 부분수열의 합 2

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

www.acmicpc.net

과 같은 경우에는 N이 최대 40이기 때문에 O(2^N)일 경우 시간초과가 걸린다.

'알고리즘 > Backjoon' 카테고리의 다른 글

[C++] 1051 - 숫자 정사각형  (0) 2019.12.19
[C++] 1012 - 유기농 배추  (0) 2019.12.19
[C++] 1999 - 최대 최소  (0) 2019.12.15
[C++] 11048 - 이동하기  (0) 2019.12.07
[C++] 10865 - 친구 친구  (0) 2019.12.07
Comments