ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.