본문 바로가기

카테고리 없음

백준 2961 - 도영이가 만든 맛있는 음식 (C++)

알고리즘 거진 반년을 손 놓으니 뇌가 깨끗해져서 한시간 걸렸다...

 

브루트포스로 전형적인 재귀나 dfs로 풀어도 되지만, C++을 공부하고 비트마스킹을 다시 봤던 차라 비스마스킹으로 풀었다.

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

 

2961번: 도영이가 만든 맛있는 음식

첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은

www.acmicpc.net

 

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    int i;
    cin >> i ;
    long long S[i];
    long long B[i];
    
    int idx = 0;
    long long result = 0;
    
    while(idx < i) {
        if (idx == 0) {result = abs(S[idx] - B[idx]);}
        cin >> S[idx] >> B[idx];
        result = min(result, abs(S[idx] - B[idx]));
        idx++;
    }
    //비트 마스킹을 이용해 브루트 포스 순회
    for(int j = 1; j < 1<<i ; j++) { //모든 수를 순회   
        long long sVal = 1;
        long long bVal = 0;
        for(int index = 0; index<i; index++) { // 한 비트씩 옮겨가며 1의 개수를 체크
            if(j & 1<<index) {
                sVal *= S[index];
                bVal += B[index];
            }
        }
        result = min(result, abs(sVal - bVal));
    }
    
    cout << result << "\n";
    return 0;
}