컴퓨터 공학/백준

[백준] JAVA 자바 : 카드 구매하기 (11052번)

kim-dev 2024. 1. 22. 21:01
반응형

 


N개의 카드를 구매하기 위해서는 price[N]의 가격과 dp[N-i] + dp[i] (i <= N)을 반복 비교하여 최댓값/최솟값을 구할 수 있다.
사실 이게 글로 작성하기는 되게 애매해서… 아래 코드를 보고 DP를 조금만 이해한다면 쉽게 해결할 수 있을 것이다.

 

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

public class BuyingCards {

    static int[] dp;
    static int[] price;

    public static int stoi(String str) {
        return Integer.parseInt(str);
    }

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

        int N = stoi(br.readLine());
        dp = new int[N+1]; // 금액의 최댓값을 저장하는 dp 배열
        price = new int[N+1]; // 가격 Pi를 저장하는 배열

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i=1; i<=N; i++) {
            price[i] = stoi(st.nextToken());
        }

        dp[1] = price[1];
        for (int i=2; i<=N; i++) {
            int max = price[i]; // N개를 한 번에 살 수 있는 가격과 비교
            for (int j=1; j<=i; j++) { // 바텀탑 방식
                int tmp = dp[j] + dp[i-j];
                if (tmp > max) { max = tmp; }
            }
            dp[i] = max;
        }

        System.out.println(dp[N]);
    }
}

 

 

로그인

 

www.acmicpc.net

 

 

작성일자: 2023-11-26