본문 바로가기

PS/백준

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

728x90

www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

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

www.acmicpc.net

 

 

프로그래머스에서 DFS관련 문제를 푸는데

뭔가 진행 후 다시 돌아왔을때를 가정해서 카운트를 해야 될 것 같은 문제를 봤었습니다

 

결국 못 풀었고 과연 이러한 문제는 어떻게 풀어야 하나 찾던 중

백트래킹 이라는 알고리즘을 발견했습니다.

 

아직 완벽히 이해가 되진 않았지만 주석에 보이는 그대로 미포함, 포함 상태를 각각 탐색한 후 

포함상태에서 다시 미포함 상태로 바꿔주는게 메인 아이디어인 것 같습니다.

 

조금 더 여러 문제를 풀어봐야겠습니다.

 

 

 

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
#include <iostream>
#include <vector>
 
using namespace std;
int n, s;
vector<int> v(n);
int sum,cnt;
void dfs(int curr)
{
    if (curr == n) return;
    if (sum + v[curr] == s) cnt++;
    //원소 미포함
    dfs(curr + 1);
 
    //원소 포함
    sum += v[curr];
    dfs(curr + 1);
 
    //되돌리기
    sum -= v[curr];
 
}
int main()
{
    cin >> n >> s;
    for (int i = 0; i < n; i++)
    {
        int a;
        cin >> a;
        v.push_back(a);    
    }
    dfs(0); //인덱스를 기준으로
    cout << cnt;
    return 0;
}
cs

 

 

728x90

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

[백준 5427번] 불 C++  (0) 2021.03.18
[백준 2468번] 안전 영역 C++  (0) 2021.03.18
[백준 11403번] 경로찾기 C++  (0) 2021.03.17
[백준 1018번]체스판 다시 칠하기 C++  (0) 2021.03.16
[백준 2503번] 숫자 야구 C++  (0) 2021.03.16