본문 바로가기

Problem/DP

[C/C++] BOJ 11052 :: 카드 구매하기

BOJ 11052 :: 카드 구매하기




문제 링크 : https://www.acmicpc.net/problem/11052






나의 풀이




학부 고급알고리즘 시간 때 배운 Knapsack 알고리즘을 생각하며 풀었다!


1. 카드 1개를 갖기 위해 지불해야 하는 금액의 최댓값은 카드 1개가 포함된 카드팩의 가격이므로 그 값을 그대로 저장한다.


2. 카드 2개부터는 지금까지 저장한 카드를 갖기위해 지불해야 하는 금액의 최댓값과 카드팩의 가격을 이용하여 비교한 후 갱신한다.


Ex) 카드 2개를 갖기 위해 지불해야 하는 금액의 최댓값은


1) 카드 0개를 갖기 위해 지불해야 하는 금액의 최댓값 + 카드 2개가 포함된 카드팩의 가격 = 5

현재 저장되는 최댓값은 5

2) 카드 1개를 갖기 위해 지불해야 하는 금액의 최댓값 + 카드 1개가 포함된 카드팩의 가격 = 2

비교 결과, 저장되는 값은 5


이와 같은 식으로 dp 배열을 갱신해 나가면 dp[N]에 카드 N개를 갖기 위해 지불해야 하는 금액의 최댓값이 저장된다.


예제 입력 1에서의 dp 배열의 값은 1 5 6 10 이 된다.




나의 코드




Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_11052/BOJ_11052.cpp




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 백준알고리즘 11052번 :: 카드 구매하기
#include<iostream>
using namespace std;
#define max(a, b) (a > b) ? a : b
 
int N;
int arr[1002];
int dp[1002];
 
int main(void)
{
    cin >> N;
 
    for (int i = 1; i <= N; i++)
        cin >> arr[i];
    
    dp[1= arr[1];
 
    for (int i = 2; i <= N; i++)
    {
        for (int j = 0; j < i; j++) {
            dp[i] = max(dp[i], dp[j] + arr[i - j]);
        }
    }
 
    cout << dp[N];
    return 0;
}
cs


'Problem > DP' 카테고리의 다른 글

[C/C++] BOJ 11053 :: 가장 긴 증가하는 부분 수열  (0) 2019.02.23
[C/C++] BOJ 1932 :: 정수 삼각형  (0) 2019.02.23
[C/C++] BOJ 2306 :: 유전자  (0) 2019.02.19
[C/C++] BOJ 1890 :: 점프  (0) 2019.02.14
[C/C++] BOJ 1103 :: 게임  (0) 2019.02.05