*이 글은 2022년 1월~2월 노션으로 진행한 알고리즘 스터디를 옮긴 글입니다. 나동빈 저자 이것이 취업을 위한 코딩테스트다를 사용해 학습했습니다.
#include <iostream>
#include<algorithm>
using namespace std;
int d[30001];
int x;
int main() {
cin >> x;
for (int i = 2; i <= x; i++) {
d[i] = d[i - 1] + 1;
if (i % 2 == 0) d[i] = min(d[i], d[i / 2] + 1);
if (i % 3 == 0) d[i] = min(d[i], d[i / 3] + 1);
if (i % 5 == 0) d[i] = min(d[i], d[i / 5] + 1);
}
cout << d[x] << endl;
}
arr[0] | arr[1] | arr[2] | arr[3] |
---|---|---|---|
1 | 2 | 3 | 4 |
- 코드(참고)
```cpp
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int d[100];
int n;
vector<int> arr;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
d[0] = arr[0];
d[1] = max(arr[0],arr[1]);
for (int i = 2; i < n; i++) {
d[i] = max(d[i - 1], d[i - 2] + arr[i]);
}
cout << d[n - 1] << '\n';
return 0;
}
```
#include<iostream>
using namespace std;
int d[1001];
int main() {
int x;
cin >> x;
d[1] = 1;
d[2] = 3;
for (int i = 3; i <= x; i++) {
d[i] = (d[i - 1] + d[i - 2] * 2) % 796796;
}
cout << d[x] << endl;
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m;
vector<int> arr;
int main(void) {
// 정수 N, M을 입력받기
cin >> n >> m;
// N개의 화폐 단위 정보를 입력 받기
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
// 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
vector<int> d(m + 1, 10001);
// 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0;
for (int i = 0; i < n; i++) {
for (int j = arr[i]; j <= m; j++) {
// (i - k)원을 만드는 방법이 존재하는 경우
if (d[j - arr[i]] != 10001) {
d[j] = min(d[j], d[j - arr[i]] + 1);
}
}
}
// 계산된 결과 출력
if (d[m] == 10001) { // 최종적으로 M원을 만드는 방법이 없는 경우
cout << -1 << '\n';
}
else {
cout << d[m] << '\n';
}
}