문제링크 : 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 |