-
BOJ 1182 : 부분집합의 합백준 문제풀이/BRUTE FORCE 2020. 1. 29. 16:42
문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
풀이
아래의 코드에서 틀린점을 찾아보세요.
void go(int index, long long sum) { if (sum == s) { ans++; return ; } if (index >= n) { return; } go(index + 1, sum + a[index]); go(index + 1, sum); }
이 코드는 제가 처음 작성한 코드인데
제가 재귀함수를 풀때 이러한 실수를 빈번하게 하더라구요.
S 가 0인 경우 SUM 의 시작이 0이기 때문에
재귀를 전혀하지 못하고 바로 return 되는
엉망진창의 재귀함수 였어요 ... ㅠㅠ
네, 그냥 여담이였습니다.
코드
#include <iostream> #include <vector> #include <algorithm> using namespace std; int n, s; int ans = 0; vector<int> a; void go(int index, long long sum) { if (index == n) { if (sum == s) { ans++; } return; } go(index + 1, sum + a[index]); go(index + 1, sum); } int main() { cin >> n >> s; for (int i = 0; i < n; i++) { int x; cin >> x; a.push_back(x); } go(0, 0); if (s == 0) ans--; cout << ans << '\n'; return 0; }
'백준 문제풀이 > BRUTE FORCE' 카테고리의 다른 글
BOJ 13460 : 구슬 탈출 2 (0) 2020.02.06 BOJ 14391 : 종이 조각 (0) 2020.01.30 BOJ 1759 : 암호 만들기 (0) 2020.01.29 BOJ 2529 : 부등호 (0) 2020.01.12 [Brute Force] BOJ 14500 : 테트로미노 (0) 2019.09.06