코딩테스트/C++

[ 백준 BOJ ] 1106번 - 호텔 (C++)

최-코드 2025. 4. 28. 16:14

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

 

생각 흐름

  • 인원/비용을 계산한 다음 큰 순으로 정렬하고 답 구하기 -> 예제 1번 부터 성립 X
  • 최솟값을 구하는 문제이므로 DP 점화식 생각해보기로 결정
    • dp[i] = max(dp[i], dp[i+인원] + 인원에 따른 비용)와 같이 세워보니 답이 나올 거 같았다.
  • 이때 주의할 점으로는 딱 C의 값을 맞추는 게 아니므로 dp 배열 중 C값 이상 인덱스 중에서 최솟값을 찾아줘야 한다.

 

#include <iostream>
#include <vector>
#include <memory.h>
#include <cmath>

using namespace std;

int C, N;
pair<int, int> p[20];
int dp[3000];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin>>C>>N;
    
    for(int i = 0; i<N; i++){
        int a, b;
        cin>>a>>b;
        
        p[i] = {a,b};
    }
    
    for(int i = 1; i<3000; i++){
        dp[i]=987654321;
    }
    dp[0] = 0;
    
    for(int i = 0; i<=C; i++){
        if(dp[i] == 987654321) continue;
        
        for(int j = 0; j<N; j++){
            dp[i+p[j].second] = min(dp[i+p[j].second], dp[i]+p[j].first);
        }
    }
    
    int answer = 987654321;
    for(int i = C; i<C+101; i++){
            answer = min(answer, dp[i]);
    }
    
    cout<<answer<<endl;
    
    return 0;
}