Problem Solving/BOJ

[백준 14916번] [동적 계획법] 거스름돈

  • -
728x90
반응형

Approach

이 문제를 보고 그리디 문제라고 오해하기 쉬우나, 2원과 5원의 최대공약수가 1이므로 단순히 큰 숫자를 더 많이 가져가는 식의 접근 방법이 통하지 않는다.

 

dp[i] : minimum number of constructing i(Won) using 2 and 5

Therefore dp[i] = min(dp[i - 2], dp[i - 5]) + 1 (Base case : dp[2] = 1, dp[5] = 1)

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;

int dp[100001];

int main(void){
    fastio;
    memset(dp, -1, sizeof(dp));
    dp[2] = 1;
    dp[4] = 2;
    dp[5] = 1;
    for(int i = 6; i <= 100000; i++){
        if(dp[i - 5] == -1 && dp[i - 2] == -1) continue;
        else if(dp[i - 5] == -1) dp[i] = dp[i - 2] + 1;
        else if(dp[i - 2] == -1) dp[i] == dp[i - 5] + 1;
        else dp[i] = min(dp[i - 5], dp[i - 2]) + 1;
    }

    int n;
    cin >> n;
    cout << dp[n] << "\n";
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.