Algorithm/Beakjoon

[JAVA] 백준 11052번 : 카드 구매하기

mopipi 2024. 1. 25. 20:41
반응형

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

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net


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

public class Main {
    static int N;
    static int[] cardPack;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        cardPack = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            cardPack[i] = Integer.parseInt(st.nextToken());
        }
        int[] dp = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            for (int j = 0; j <= N; j++) {
                if(i > j) continue;
                dp[j] = Math.max(dp[j], dp[j - i] + cardPack[i]);
            }
        }
        System.out.println(dp[N]);
    }
}

💡 DP

풀이

  • 처음에는 그리디를 사용해 풀려고 했는데 반례 존재함 = 카드 1장 별 가치로 정렬해도 유효하지 않음,,,
5  // 1 9 18 25 1 => 정답 27 (2 + 3) / 출력 26 (1+4)
  • 가치의 차이가 명확하게 정해져 있지 않을 때는 그리디가 패착!!! DP로 경로를 돌리자..ㅎ

  • 0/1 knapsack 생각해서 복잡하게 풀다가 겁나 꼬였다..ㅎㅎ 그냥 단순하게 푸는게 답
  • 해당 카드를 담는 경우 VS 담지 않는 경우 최댓값을 구하자
    • dp[구매한 카드 개수] 로 현재 누적 카드 개수가 j개인 상황에서 i개 팩을 사는/사지 않는 경우에 대해 최대 값을 갱신하는 것

 

 

반응형