#문제
2839번: 설탕 배달
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그��
www.acmicpc.net
#풀이
이 문제는 dp를 통해 해결하는 문제이다. Nkg 최적화 문제를 N-3kg 최적화 문제와 N-5kg 최적화 문제를 통해 답을 도출하는 optimal substructure로 구현했다. 기본적인 구현은 쉬웠지만, 정확하게 N킬로그램을 만들 수 없을 때 -1을 출력하게 만드는 것에서 약간 고민을 해야했다. 문제를 해결한 뒤 다른 분의 dp풀이(링크) 코드를 봤는데, 훨씬 깔끔했다. 나는 3을 빼고 5를 빼는 과정에서 필요한 부분만 계산했지만, 다른 분은 그저 N까지 순서대로 모두 계산했다. 시간복잡도에 큰 차이가 없으므로 for문으로 N까지 순서대로 모든 수에 대해 계산하는 것이 더 좋은 것 같다. 그리고 초기의 vector에 모두 아주 큰 값을 넣어주어 -1출력부분을 처리한 점도 훨씬 깔끔했다. 다른 분의 코드를 보며 추가로 C++ STL Vector(링크)에 대해서도 학습했다.
#소스 코드
|
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include<iostream>
#include<algorithm>
using namespace std;
int arr[5005];//처음에 모두 0으로 초기화됨
int opti(int num) {
if (arr[num] == -1)
return -2;
else if (arr[num] > 0)
return arr[num];
else {
int n1 = opti(num - 3) + 1;
int n2 = opti(num - 5) + 1;
if (n1 == -1 && n2 == -1)
return -2;
else if (n1 == -1 || n2 == -1) {
arr[num] = max(n1, n2);
return arr[num];
}
else {
arr[num] = min(n1, n2);
return arr[num];
}
}
}
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
arr[0] = -1; arr[1] = -1; arr[2] = -1;
arr[3] = 1; arr[4] = -1; arr[5] = 1;
int N;
cin >> N;
int result = -1;
if (N <= 5)
result = arr[N];
else {
int n1 = opti(N - 3) + 1;
int n2 = opti(N - 5) + 1;
if (n1 == -1 || n2 == -1)
result = max(n1, n2);
else
result = min(n1, n2);
}
cout << result << "\n";
}
|
cs |
'Algorithm > Dynamic Programming' 카테고리의 다른 글
| [C++] 백준 11727번 : 2×n 타일링 2(S3) (0) | 2020.11.05 |
|---|---|
| [C++] 백준 11726번 : 2×n 타일링 (S3) (0) | 2020.11.05 |
| [C++] 백준 1463번 : 1로 만들기 (S3) (0) | 2020.11.05 |
| [C++] 백준 11048번 : 이동하기 (S1) (0) | 2020.10.18 |
| [C++] 백준 11049번 : 행렬 곱셈 순서 (G3) (0) | 2020.10.17 |