개발세발은 안되요

[C++]BJO 1882 : 부분수열의 합 본문

알고리즘/백준

[C++]BJO 1882 : 부분수열의 합

금호박 2026. 1. 27. 10:30

문제

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

 

 

 

 

풀이

백트래킹을 이용해 푼다.

arr[]에 수열을 입력받고, used[]에 부분수열에 포함시킬 원소들을 표시해가며 표시한 원소의 합이 m이 될 때마다 카운트한다.

 

이때 부분수열이기 때문에, 숫자들간의 순서는 유지되어야 한다. 즉 각 부분수열 원소의 index는 뒤집히면 안된다.

 

 

코드

#include <iostream>
using namespace std;

int n,m, ans;
int arr[21];
int used[21];

void solve(int idx){

    int cnt = 0, num = 0;
    for(int i=1; i<=n; i++){
        if(used[i] == 1) {
            num++; // 공집합 제외 위함
            cnt += arr[i];
        }
    }
    
    if(cnt == m && num!=0) ans++;
    
    for(int i= 1; i<=n; i++){
        if(used[i] == 0 && idx <= i){
            used[i] = 1;
            solve(i);
            used[i] = 0;
        }
    }
}

int main() {
    cin >> n >> m;
    for(int i=1; i<=n; i++) cin >> arr[i];
    
    solve(1);
    cout << ans << "\n";
    return 0;
}

 

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA] BJO 17143 : 낚시왕  (0) 2026.02.04
[C++] BJO 15683 : 감시  (0) 2026.01.30
[C++] BJO 15651 : N과 M(3)  (0) 2026.01.26
[C++] BJO 15650 : N과 M(2)  (0) 2026.01.26
[C++]BJO 15886 : 내 선물을 받아줘2  (0) 2026.01.20