Suhwanc

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

 

16194번: 카드 구매하기 2

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

www.acmicpc.net

 

풀이

DP(Dynamic programming) 문제입니다!

bottom - up 방식으로 이 문제를 해결해보자면,

각 카드팩의 값을 p[1~n] 이라고 두면

카드 1개를 갖기 위한 금액의 최솟값(=d[1])은 p[1] 

카드 2개를 갖기 위한 금액의 최솟값은 min(p[2],d[1]+p[1])

카드 3개를 갖기 위한 금액의 최솟값은 min(p[3],d[2]+p[1],d[1]+p[2])

카드 4개를 갖기 위한 금액의 최솟값은 min(p[4],d[3]+p[1], d[2]+p[2], d[1]+p[3])

...

카드 n개를 갖기 위한 금액의 최솟값은 min(p[n], d[n-1]+p[1], d[n-2]+p[2], ..., d[1]+p[n-1])

이므로

2중 for문으로 dp를 구할 수 있다.

 

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>
using namespace std;
 
int p[1001];
int d[1001];
int main()
{
    int n; scanf("%d"&n);
    for (int i = 1; i <= n; i++) {
        scanf("%d"&p[i]);
        d[i] = p[i];
    }
    
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            d[i] = min(d[i], d[i - j] + p[j]);
        }
    }
    printf("%d", d[n]);
    return 0;
}
cs

개발환경 : Visual Studio 2019

지적, 조언 언제든지 환영입니다~~

'백준 문제풀이' 카테고리의 다른 글

백준 17299번 오등큰수  (0) 2020.01.16
백준 17298번 오큰수  (0) 2020.01.16
백준 17425번 약수의 합  (2) 2020.01.14
백준 17427번 약수의 합 2  (2) 2020.01.14
백준 4375번 1  (0) 2020.01.14