λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 18429번 - 근손싀

by μ•ˆμ£Όν˜• 2022. 8. 23.

문제

 

18429번: 근손싀

μ›¨μ΄νŠΈ νŠΈλ ˆμ΄λ‹μ„ μ’‹μ•„ν•˜λŠ” μ–΄λ–€ λŒ€ν•™μ›μƒμ€, ν˜„μž¬ 3λŒ€ μš΄λ™ μ€‘λŸ‰ 500의 κ΄΄λ ₯을 μ†Œμœ ν•˜κ³  μžˆλ‹€. λ‹€λ§Œ, ν•˜λ£¨κ°€ 지날 λ•Œλ§ˆλ‹€ μ€‘λŸ‰μ΄ K만큼 κ°μ†Œν•œλ‹€. 예λ₯Ό λ“€μ–΄ K=4일 λ•Œ, 3일이 μ§€λ‚˜λ©΄ μ€‘λŸ‰μ΄ 488둜

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;


int N, K, ans;
vector<int> v;

bool visited[9];

void dfs(int depth, int power){
    
    if(depth == N-1 && power>=500){
        ans++;
        return;
    }
    
    for(int i=0; i<N; i++){
        if(visited[i]) continue;
        visited[i] = 1;
        if(power - K + v[i] >=500) dfs(depth+1, power - K + v[i]);
        visited[i] = 0;
    }
    
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N>>K;
    for(int i=0; i<N; i++){
        int inp; cin>>inp;
        v.push_back(inp);
    }
    
    dfs(0, 500);
    cout<<ans;
    
}

 

풀이

λ§Œλ“€μ–΄μ§€λŠ” μ‘°ν•©μ˜ λͺ¨λ“  경우λ₯Ό νƒμƒ‰ν•˜λŠ”λ°, 사전에 ν˜„μž¬ μš΄λ™ ν‚€νŠΈλ₯Ό μ μš©ν–ˆμ„λ•Œ μš΄λ™ μ€‘λŸ‰μ΄ 500미만이 λœλ‹€λ©΄ 탐색을 ν•˜μ§€ μ•ŠλŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€