πŸ•οΈ PS (BOJ)/Backtracking

[BOJ S2][C++] λ°±μ€€ 1182번: λΆ€λΆ„μˆ˜μ—΄μ˜ ν•© (58%)

선달 2022. 7. 7. 02:50
λ°˜μ‘ν˜•

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

 

1182번: λΆ€λΆ„μˆ˜μ—΄μ˜ ν•©

첫째 쀄에 μ •μˆ˜μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Nκ³Ό μ •μˆ˜ Sκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) λ‘˜μ§Έ 쀄에 N개의 μ •μˆ˜κ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ 100,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

www.acmicpc.net

 

문제

N개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ μžˆμ„ λ•Œ, 크기가 μ–‘μˆ˜μΈ λΆ€λΆ„μˆ˜μ—΄ μ€‘μ—μ„œ κ·Έ μˆ˜μ—΄μ˜ μ›μ†Œλ₯Ό λ‹€ λ”ν•œ 값이 Sκ°€ λ˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 μ •μˆ˜μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Nκ³Ό μ •μˆ˜ Sκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) λ‘˜μ§Έ 쀄에 N개의 μ •μˆ˜κ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ 100,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

첫째 쀄에 합이 Sκ°€ λ˜λŠ” λΆ€λΆ„μˆ˜μ—΄μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int n, s, ans;
vector<int> v;
vector<bool> used;

void recur(int sum, int index) {
    if(index==n) {
        if(sum==s)
            ans++;
        return;
    }
    
    recur(sum, index+1);
    recur(sum+v[index], index+1);
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    
    cin >> n >> s;
    v.assign(n, 0);
    used.assign(n, false);
    for(int i=0; i<n; i++)
        cin >> v[i];
    
    recur(0, 0);
    
    if(s==0)
        ans--;
    
    cout << ans;
    
    return 0;
}

/*
 */

 

λ§Œμ•½ 58%μ—μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ κ°€ λœ¬λ‹€λ©΄

sκ°€ 0인 경우 곡집합도 μΉ΄μš΄νŠΈν•œκ±΄ μ•„λ‹Œμ§€ μ²΄ν¬ν•΄λ³΄μž

λ°˜μ‘ν˜•