#include <iostream>
#include <vector>
using namespace std;

long long dp[100];

int main() {
    //1. 피보나치
    int n = 50;
    d[1] = 1;
    d[2] = 1;
    
    for (int i = 3; i <= n; i++) {
        d[i] = d[i-1] + d[i-2]; // 재귀 아님
    }
    cout << d[n];

    //2. 1로 만들기 - bottom up
    //int x = 26;
    //for (int i = 2; i <= x; i++) {
    //    d[i] = d[i - 1] + 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];

    //2. 1로 만들기
    //int x;
    //cin >> x;
    //
    //for (int i = 2; i <= x; i++) {
    //    dp[i] = dp[i - 1] + 1;
    //    if (i % 2 == 0) {
    //        dp[i] = min(dp[i], dp[i / 2] + 1);
    //    }
    //    if (i % 3 == 0) {
    //        dp[i] = min(dp[i], dp[i / 3] + 1);
    //    }
    //    if (i % 5 == 0) {
    //        dp[i] = min(dp[i], dp[i / 5] + 1);
    //    }
    //}
    //cout << dp[x];

    //3. 개미 전사
    //int n;
    //vector<int> arr;
    //
    //cin >> n;
    //for (int i = 0; i < n; i++) {
    //    int num;
    //    cin >> num;
    //    arr.push_back(num);
    //}
    //dp[0] = arr[0];
    //dp[1] = max(arr[0], arr[1]);
    //for (int i = 2; i < n; i++) {
    //    dp[i] = max(dp[i - 2] + arr[i], dp[i - 1]);
    //}
    //cout << dp[n - 1];

    //4. 바닥공사
    //int n;
    //cin >> n;
    //
    //dp[1] = 1;
    //dp[2] = 3; //사각형 1개, 가로긴거 2개, 세로긴거 3개 => 총 3개
    //for (int i = 3; i <= n; i++) {
    //    dp[i] = dp[i - 2] * 2 + dp[i - 1]; //사각형, 가로긴거 정해져있어서 양옆으로 세로 추가되거나함 .. 2개 곱하기
    //}

    //5. 효율적인 화폐 구성
    //int n, m;
    //vector<int> arr;
    //cin >> n >> m;
    //for (int i = 0; i < n; i++) {
    //    int x;
    //    cin >> x;
    //    arr.push_back(x);
    //}
    //
    //vector<int> d(m + 1, 10001);
    //
    //d[0] = 0;
    //for (int i = 0; i < n; i++) {
    //    for (int j = arr[i]; j <= m; j++) { //각 화폐의 단위
    //        if (d[j - arr[i]] != 10001) {
    //            d[j] = min(d[j], d[j - arr[i]] + 1); // d[j] : 금액 j를 만들수 있는 최소한의 화폐 개수
    //                                                 // d[j - arr[i]] + 1 : 화폐 하나 추가하기
    //        }
    //    }
    //}
    //if (d[m] == 10001)
    //    cout << -1;
    //else
    //    cout << d[m];
}

+ Recent posts