-
[백준/BOJ] 1182번 부분수열의 합 (C++)알고리즘 문제풀이/백준 2020. 12. 28. 16:51
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
브루트 포스(완전 탐색) 유형의 문제
현재 누적합과 현재 인덱스 값을 더한게 s와 같은지 확인해서 같으면 answer를 증가시키고, 그게 아니라면 현재 인덱스 값을 더하거나, 더하지 않고 그대로 재귀함수를 호출합니다. 이때 sum + v[idx]의 값과 s의 비교를 기저조건에서 하지 않는 이유는 입력값의 조건이 음수가 포함이므로 이를 기저조건에 두면 답인 경우가 더해지지 않는 경우가 발생하기 때문입니다.
#include <iostream> #include <vector> using namespace std; int n, s, answer = 0; vector<int> v; void DFS(int idx, int sum) { if(idx == n) return; if(sum + v[idx] == s) answer++; DFS(idx + 1, sum + v[idx]); DFS(idx + 1, sum); } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>s; v.assign(n, 0); for(int i = 0; i < n; i++) { cin>>v[i]; } DFS(0, 0); cout<<answer; }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 1260번 DFS와 BFS (C++) (0) 2020.12.29 [백준/BOJ] 9095번 1, 2, 3 더하기 (C++) (0) 2020.12.28 [백준/BOJ] 6603번 로또 (C++) (0) 2020.12.28 [백준/BOJ] 11508번 2+1 세일 (C++) (0) 2020.12.27 [백준/BOJ] 14247번 나무 자르기 (C++) (0) 2020.12.26