πŸ•οΈ ICPC Sinchon/Backtracking

[BOJ][C++] λ°±μ€€ 23057번: 도전 μˆ«μžμ™•

선달 2024. 10. 18. 00:42
λ°˜μ‘ν˜•

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

 

문제

μ˜€λŠ˜μ€ 즐거운 μΆ•μ œλ‚ μ΄λ‹€.

λ°±λ‚¨μ΄λŠ” μΆ•μ œμ—μ„œ 무엇을 ν• κΉŒ λŒμ•„λ‹€λ‹ˆλ˜ 쀑 도전 μˆ«μžμ™•μ΄λΌλŠ” 행사λ₯Ό λ°œκ²¬ν–ˆκ³  100λ§Œμ›μ΄λΌλŠ” μƒκΈˆμ— 홀렀 λ°”λ‘œ μ°Έκ°€ν•˜μ˜€λ‹€.

도전 μˆ«μžμ™•μ€ N개의 숫자 μΉ΄λ“œλ₯Ό μ‘°ν•©ν•˜μ—¬ λ‹€μ–‘ν•œ 수λ₯Ό λ§Œλ“œλŠ” κ²Œμž„μ΄λ‹€.

이번 λΌμš΄λ“œμ—μ„œλŠ” μΉ΄λ“œμ˜ 적힌 수의 ν•©μœΌλ‘œ λ§Œλ“€ 수 μ—†λŠ” 수의 개수λ₯Ό μ™ΈμΉ˜λ©΄ 이긴닀.

백남이가 1등을 ν•˜μ—¬ μΆ•μ œλ₯Ό 즐길 수 μžˆλ„λ‘ λ„μ™€μ£Όμž.

μž…λ ₯

첫 번째 μ€„μ—λŠ” μΉ΄λ“œμ˜ 개수 N(1≤N≤20)이 주어진닀.

두 번째 μ€„μ—λŠ” N개의 μˆ˜κ°€ 주어진닀.

μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μˆ˜λŠ” 100,000,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

λͺ¨λ“  μΉ΄λ“œμ— 적힌 수의 합을 M이라고 ν•  λ•Œ, 1 이상 M μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 λ§Œλ“€ 수 μ—†λŠ” 수의 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ λͺ¨λ“  경우의 수λ₯Ό κ΅¬ν•œλ‹€

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int n, m;
vector<int> input;
set<int> result;

void recur(int k, int sum) {
    if(k==n) {
        result.insert(sum);
        return;
    }

    // k번 μΉ΄λ“œ 포함
    recur(k+1, sum+input[k]);
    
    // λΆˆν¬ν•¨
    recur(k+1, sum);
}

int main() {
    // μž…λ ₯
    cin >> n;
    input.assign(n, 0);
    for(int i=0; i<n; i++) {
        cin >> input[i];
        m += input[i];
    }

    // λ°±νŠΈλž˜ν‚Ή
    recur(0, 0);
    
    // λ§Œλ“€ 수 μ—†λŠ” 수의 갯수
    int canMake = result.size()-1; // ν•˜λ‚˜λ„ μ„ νƒν•˜μ§€ μ•Šμ€ 경우 μ œμ™Έ
    cout << m - canMake;
    
    return 0;
}
λ°˜μ‘ν˜•