Algorithm/Baekjoon

[Algorithm/Baekjoon] 카우버거 알바생 - 17208 (G4/JAVA)

dpdms2148 2025. 3. 10. 21:23
728x90

📑문제링크

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

💻코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int N, M, K, answer;
    static int[][] order;
    static int[][][] dp;

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


        N = Integer.parseInt(st.nextToken());// 주문의 수
        M = Integer.parseInt(st.nextToken());// 남은 치즈버거 갯수
        K = Integer.parseInt(st.nextToken());// 남은 감자튀김 갯수

        order = new int[N + 1][2];

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

        dp = new int[N + 1][M + 1][K + 1];
        for (int n = 0; n <= N; n++) {
            for (int m = 0; m <= M; m++) {
                for (int k = 0; k <= K; k++) {
                    dp[n][m][k] = -1;
                }
            }
        }
        //processingOrder(0, 0, 0, 0); -> 시간초과
        int answer = processingOrder(0, M, K);
        System.out.println(answer);

    }
    
    /*private static void processingOrder(int index, int count, int sumX, int sumY) {
        if (sumX <= M && sumY <= K) {
            answer = Math.max(answer, count);
        } else {
            return;
        }
        if (index >= N) return;

        processingOrder(index + 1, count + 1, sumX + order[index][0], sumY + order[index][1]);
        processingOrder(index + 1, count, sumX, sumY);
    }*/
    
    private static int processingOrder(int index, int x, int y) {
        if (index == N) return 0;
        if (dp[index][x][y] >= 0) return dp[index][x][y];

        if (order[index + 1][0] <= x && order[index + 1][1] <= y) {
            dp[index][x][y] = processingOrder(index + 1, x - order[index + 1][0], y - order[index + 1][1]) + 1;
        }
        dp[index][x][y] = Math.max(dp[index][x][y], processingOrder(index + 1, x, y));
        return dp[index][x][y];
    }
}
728x90