BOJ

백준 11052 - 카드 구매하기

yanJuicy 2019. 7. 5. 22:05
반응형

문제

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

 

11052번: 카드 구매하기

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

www.acmicpc.net

 

풀이

1부터 N까지의 수 중에서 조합을 해서 N을 만드는 경우의 최대값을 구하는 문제이다. 

 

D[N]을 N개를 갖기 위해 지불하는 최대 금액으로 한다.

N이 4라고 하고 P[1] ~ P[4]까지 카드의 금액이 주어진다고 하면

○ + ○ + ○ + ● = 4 에서

●에 올 수 있는 수는 1, 2, 3, 4 가 된다.

그럼 가능한 점화식은 다음이 된다.

D[4] = max {

    D[4-1] +P[1],

    D[4-2] + P[2],

    D[4-3] + P[3],

    D[4-4] + P[4] = D[0] + P[4]

}

 

이 점화식을 일반화 하여 문제를 해결한다.

D[N] = max {

    D[N-1] +P[1],

    D[N-2] + P[2],

    D[N-3] + P[3],

    ......

    D[N-N] + P[N]

}

코드

탑다운 방식

 

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
#include <iostream>
#include <algorithm>
using namespace std;
int N;
int P[1001];
int dp[1001];
int f(int N)
{
    if (N == 0return 0;
    if (dp[N]) return dp[N];
    int result = 0;
    for (int i = 1; i <= N; i++)
        result = max(result, f(N - i) + P[i]);
    return dp[N] = result;
}
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> N;
    for (int i = 1; i <= N; i++cin >> P[i];
    cout << f(N);
    return 0;
}
 
cs

 

바텀업 방식

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
29
30
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int N;
int P[1001];
int dp[1001];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> N;
    for (int i = 1; i <= N; i++cin >> P[i];
 
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            dp[i] = max(dp[i], dp[i - j] + P[j]);
        }
    }
 
    cout << dp[N];
 
    return 0;
}
 
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 11057 - 오르막 수  (0) 2019.07.08
백준 10844 - 쉬운 계단 수  (0) 2019.07.07
백준 2309 - 일곱 난쟁이  (0) 2019.07.03
백준 13904 - 과제  (1) 2019.07.02
백준 2212 - 센서  (1) 2019.06.30