๐Ÿ•๏ธ 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;
}
๋ฐ˜์‘ํ˜•