본문 바로가기

Coding Test

백준 1106 호텔

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

 

1106번: 호텔

첫째 줄에 C와 형택이가 홍보할 수 있는 도시의 개수 N이 주어진다. C는 1,000보다 작거나 같은 자연수이고, N은 20보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각 도시에서 홍보할 때

www.acmicpc.net

#include <iostream>
#include <vector>

using namespace std;

//dp[i]: i원으로 얻을 수 있는 최대 고객
int dp[100001];

int main() {

    int c, n;

    cin >> c >> n;
    vector<pair<int, int>> ad(n + 1);       //{비용, 이득}


    for (int i = 1; i <= n; i++) {
        cin >> ad[i].first >> ad[i].second;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = ad[i].first; j <= 100000; j++) {
            dp[j] = max(dp[j], dp[j - ad[i].first] + ad[i].second);
        }
    }

    for (int i = 1; i <= 100000; i++) {
        if (dp[i] >= c) {
            cout << i;
            break;
        }
    }


    return 0;
}

 

dp[i]: i원으로 얻을 수 있는 최대 고객

최대 고객이 1000명이고, 그런 도시가 100개까지 존재하기 때문에 100,000개의 dp 배열을 선언한다.

 

 

dp[j]=max(dp[j], dp[j-ad[i].first]+ad[i].second);

j원으로 얻을 수 있는 고객은 현재 고객과 해당 비용을 제출하였을 때의 고객을 비교하여 최댓값을 뽑으면 점화식이 완성된다.

 

if(dp[i]>=c) cout<<i;

이 문제는 고객을 c명 유치하기 위해 필요한 최소 금액이다. 즉 i원으로 유치할 수 있는 고객이 처음으로 c명이 넘어가면 그 값을 출력하면 된다. 

'Coding Test' 카테고리의 다른 글

백준 13164 행복 유치원  (0) 2024.04.10
7569 백준 토마토  (0) 2024.04.09
백준 4256 트리  (1) 2024.04.07
백준 4195 친구 네트워크  (3) 2024.04.06
백준 21939 문제 추천 시스템 Version 1  (0) 2024.04.05