본문 바로가기
알고리즘

백준 s2 1182 부분수열의 합 c++

by kyj0032 2024. 1. 15.

https://www.acmicpc.net/problem/1182

 

풀이

1. 1+3+2나 1+2+3이나 동일하므로, 중복되지 않도록 하였다.

2. S=3 일 때, 1+2로 S 조건을 충족해도 1+2+(-2)+(-1) 이나 0을 더하는 등 조건을 만족하는 부분수열이 더 있을 수도 있기 때문에 return으로 끝내지 않고 더 가야 한다

3. S=0 일 때, func(0)에서 맨 처음 시작이 0이기 때문에 최종 answer에서 -1 해줘야 한다.

 

수도 코드

func (int i) { //i번째 인덱스부터 시작
	if (sum == S)
    	answer++;
    
    for(j: i+1 ~ N-1)
    	sum += arr[j]
        func(j+1)
        sum -= arr[j]
}

 

 

코드

/*boj s2 1182 부분수열의 합*/
#include <iostream>
#define MAXN 22
using namespace std;

int N, S;
int sum = 0;
int answer = 0;
int arr[MAXN];

void func(int i) { // i번째 인덱스부터 시작
    if (sum == S) {
        answer++;
    }

    for (int j = i; j < N; j++) {
        sum += arr[j];
        func(j + 1);
        sum -= arr[j];
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> S;

    for (int i = 0; i < N; i++)
        cin >> arr[i];

    func(0);

    if (S == 0) // 아무 것도 없는 경우 제외
        cout << answer - 1 << "\n";
    else
        cout << answer << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 s3 15651 N과 M (3) c++  (0) 2024.01.15
백준 s3 15650 N과 M (2) c++  (0) 2024.01.15
백준 g4 9663 N-Queen c++  (0) 2024.01.15
백준 s3 15649 N과 M (1) c++  (0) 2024.01.15
백준 g5 2448 별 찍기 - 11 c++  (0) 2024.01.13