BOJ 백준

백준 2294번, 동전 2(C, C++)

simun 2022. 8. 3. 19:44

2294번: 동전 2 (acmicpc.net)

 

2294번: 동전 2

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주

www.acmicpc.net

해당 문제는 다이나믹 프로그래밍으로 문제를 해결하였습니다.

 

 예제는 3가지의 동전{1, 5, 12} 과 15원을 만드는데 최소 동전 수를 구하는 문제입니다.

1-> 1                 dp[1] = 1

2 - > 1, 1           dp[2] = 2

3 -> 1, 1 , 1       dp[3] = 3

4 -> 1, 1, 1, 1    dp[4] = 4

5 - > 1, 1, 1, 1, 1   dp[5] = 5

        or

        5

위 예시에서 동전 1원인 경우에 dp[i]는 dp[i-1]의 동전 수에서 +1이 된 것을 알 수 있습니다.

다만 dp[5]인 경우, dp[4] 동전수 + 1이 된 것이 아닙니다,  저희가 구해야 하는 것은 최소 동전 수입니다.

아무것도 없는 dp[0]에서 + 1이 된 것을 알 수 있습니다.

동전을 배열 coin로 정의하면, 점화식으로 표현할 수 있습니다.

min(dp[i-coin[j]] + 1, dp[i])

#include<iostream>
#include<algorithm>

#define INF 10001

using namespace std;

int main(){
    int N;
    int K;
    int coin[101];
    int dp[10001];
    dp[0] = 0;

    cin>>N>>K;
    for(int i = 1; i <= K; i++){
        dp[i] = 10001;
    }
    
    for(int i = 1; i <= N; i++){
        cin>>coin[i];    
    }

    for(int i = 1; i <= K; i++){
        for(int j = 1; j <= N; j++){
            if(i - coin[j] >= 0){
                dp[i] = min(dp[i-coin[j]] + 1, dp[i]);
            }
        }
    }
    if(dp[K] == 10001){
        cout<<-1;
    }else if(dp[K] != 10001){
        cout<<dp[K];
    }
   return 0;    
}