문제:

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력:

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

출력:

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.

접근 방법

  • 값을 n번 더해서 찾는다.
    • 여기서 공집합은 0을 더하는 것으로 포함한다.
    • 만약 합이 0 이면 0을 n번더해서 0이기때문에 0일경우 1 뺀다.

코드

접기/펼치기

#include <iostream>

using namespace std;

int n, s;
int map[20];
int cnt;

void func(int k, int cal)
{
    if (k == n)
    {
        if (cal == s)
            cnt++;
        return;
    }

    // 현재 원소를 선택하지 않는 경우
    func(k + 1, cal);

    // 현재 원소를 선택하는 경우
    func(k + 1, cal + map[k]);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> s;

    for (int i = 0; i < n; i++)
        cin >> map[i];

    func(0, 0);
    if(s==0)cnt--;
    cout << cnt;
}
  • 재귀는 어려웡

'개인 공부 > 백준' 카테고리의 다른 글

15651번 N과 M (3)  (0) 2024.05.03
15650번 N과 M (2)  (2) 2024.05.02
9663번 N-Queen  (1) 2024.04.29
6593번 상범빌딩  (0) 2024.04.27
5014번 스타트링크  (0) 2024.04.24

+ Recent posts