문제 링크 : https://www.acmicpc.net/problem/16194
풀이
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 |