[백준] 1106: 호텔 - JAVA

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

풀이

dp문제.

고객수를 C명 늘려야 한다.

한 도시에서 한번의 비용으로 얻을 수 있는 고객의 수는 100이하이므로

C + 101 까지 dp배열을 만든다.

한 비용으로 얻을 수 있는 고객의 수를 value라고 할 때,

“dp[j - value] + 비용”과 “dp[j]”의 최솟값을 dp[j]에 담는다.

dp배열을 다 채운 후 인덱스가 C이상인 값들 중에서 최솟값을 찾는다.


메모리: 14224KB

시간: 128ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int C = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        int[][] arr = new int[N][2];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        // 한 번에 얻을 수 있는 고객의 수는 100보다 작거나 같다
        // C명 이상이면 되므로 C + 101 까지 배열에 담는다
        int[] dp = new int[C + 101];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;

        for (int i = 0; i < N; i++) {
            int cost = arr[i][0];
            int value = arr[i][1];
            for (int j = value; j < C + 101; j++) {
                if (dp[j - value] != Integer.MAX_VALUE) {
                    dp[j] = Math.min(dp[j - value] + cost, dp[j]);
                }
            }
        }

        // C명 이상 중에 최솟값 탐색
        int ans = Integer.MAX_VALUE;
        for (int i = C; i < C + 101; i++) {
            ans = Math.min(ans, dp[i]);
        }

        System.out.println(ans);

    }

}