카테고리 없음

[백준 11052번 C++] 카드 구매하기

Trudy | 송연 2023. 10. 19. 16:16

11052번: 카드 구매하기 (acmicpc.net)

 

11052번: 카드 구매하기

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

www.acmicpc.net


[이해하기]

카드의 등급으로 나타나지는 색은.... 왜 주어진거지?

필요없는 설명 아닌가?

 

여튼

예를 들어, 카드팩이 총 4가지 종류가 있고, P1 = 1, P2 = 5, P3 = 6, P4 = 7인 경우에 민규가 카드 4개를 갖기 위해 지불해야 하는 금액의 최댓값은 10원이다. 2개 들어있는 카드팩을 2번 사면 된다.

P1 = 5, P2 = 2, P3 = 8, P4 = 10인 경우에는 카드가 1개 들어있는 카드팩을 4번 사면 20원이고, 이 경우가 민규가 지불해야 하는 금액의 최댓값이다.

마지막으로, P1 = 3, P2 = 5, P3 = 15, P4 = 16인 경우에는 3개 들어있는 카드팩과 1개 들어있는 카드팩을 구매해 18원을 지불하는 것이 최댓값이다.

카드 4개를 갖기 위해서는

1 * 4 / 1 + 3 / 2 * 2 / 4 * 1  의 경우가 있다

그럼 각각의 경우 지불하는 돈은

1*4 = 4 / 1+6 = 7 / 5*2 = 10 /  7 이므로 최댓값은 10이다

 

arr[a] = 입력값(카드 a의 가격)

dp[a] = a개의 카드를 구매했을 때의 최대 비용

 

마지막에 선택하는 카드가 P1이라면? 최대 비용은 dp[n-1] + arr[1] 

마지막에 선택하는 카드가 P2라면? 최대비용은 dp[n-2] + arr[2]

마지막에 선택하는 카드가 P3이라면? 최대비용은 dp[n-3] + arr[3]

마지막에 선택하는 카드가 P4라면? 최대비용은 arr[4]

최종적으로 n개를 선택하는 최대 비용은 이 중 가장 큰 것!

 

dp[0] = 0

dp[1] = arr[1] (1개를 구매하는 방법은 P1 하나 선택하는 방법밖에 없음)

dp[2] = max(arr[1] *2, arr[2])

 

-> dp[n] = max(dp[n], dp[n-i] + arr[i])

 

[참고]

[ 백준 11052 ] 카드 구매하기 (C++) :: 얍문's Coding World.. (tistory.com)

 

[ 백준 11052 ] 카드 구매하기 (C++)

백준의 카드구매하기(11052) 문제이다. ( 문제 바로가기 ) [ 문제를 다시 푸는 과정에서 보다 구체적이고 상세한 설명으로 이 문제를 다시 포스팅 하였습니다. 아래의 글을 참고하셔서 풀이하셔도

yabmoons.tistory.com


코드로 표현해보면..!

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    //카드값 입력 받기
    int arr[n+1] = {0, };
    for(int i=1; i<=n; i++){
        cin >> arr[i];
    }
    
    //카드를 a개 샀을 때의 최대 비용을 저장하기 위한 배열 선언
    int dp[n+1] = {0, };
    
    //for문을 돌면서 카드를 a개 샀을 때의 최대 비용을 모두 저장함
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            dp[i] = max(dp[i], dp[i - j] + arr[j]);
        }
    }
    
    //최종적으로 dp[n]이 카드 n개를 샀을 때의 최대 비용
    cout << dp[n] << endl;
    
    return 0;
    
}

n=4, arr={0,1,5,6,7}, dp={0} 의 경우

이중 for문을 돌 때 dp의 저장 과정을 구해보면

 

dp[1] = max(dp[1], dp[0]+arr[1])   

=> dp[1] = 1

---------------------------------------------------------------

dp[2] = max(dp[2], dp[1]+arr[1])   

         = 2

dp[2] = max(dp[2], dp[0]+arr[2])   

         = max(2, 5)

         = 5

=> dp[2] = 5

---------------------------------------------------------------

dp[3] = max(dp[3], dp[2]+arr[1])   

         = 6

dp[3] = max(dp[3], dp[1]+arr[2])   

         = max(6, 1+5)

         = 6

dp[3] = max(dp[3], dp[0]+arr[3])   

         = max(6, 6)

         = 6

=> dp[3] = 6

---------------------------------------------------------------

dp[4] = max(dp[4], dp[3]+arr[1])   

         = 7

dp[4] = max(dp[4], dp[2]+arr[2])  

         = max(7, 5+5)

         = 10

dp[4] = max(dp[4], dp[1]+arr[3])  

         = max(10, 1+6)

         = 10

dp[4] = max(dp[4], dp[0]+arr[4])  

         = max(10, 7)

         = 10

---------------------------------------------------------------

=======> dp[4] = 10