백준/골드

[백준 2294번] 동전 2 (C++)

게임개발기원 2023. 10. 14. 15:48

문제링크 : https://www.acmicpc.net/problem/2294

 

2294번: 동전 2

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, K;
int arr[101];
int dp[1000001];

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> N >> K;
    for(int i=0; i<N; i++) cin >> arr[i];
    fill(dp, dp+1000001, MAX);
    for(int i=0; i<N; i++) dp[arr[i]]=1; //초기화
    for(int i=0; i<N; i++)
    {
        for(int j=arr[i]; j<=K; j++)
        {
            dp[j] = min(dp[j], dp[j-arr[i]]+1); //점화식
        }
    }
    cout << (dp[K] == MAX ? -1 : dp[K]);
    return 0;
}

백준 2293번 동전 1 문제와 유사한 문제이다.

동전 1의 경우에는 모든 경우의 수를 구하는 것이었고, 동전 2의 경우는 동전의 최소 사용 갯수만 구하는 것이다.

 

처음에 초기값을 설정해주는데 dp[arr[i]]=1을 해줌으로써 입력받은 동전들에 대해서 최소 갯수인 1로 초기화해준다.

그리고 최소값을 넣어주는 DP 배열도 MAX로 초기화해주었다.

 

이 후 이를 토대로 현재 합에 대해 동전들이 이루는 경우의 수의 최소값을 담아주는데 현재 값과 현재 동전을 사용하기 이전 값 + 1을 비교하여 최소값을 담아준다.

(ex : K=5 -> 5원 동전 1개 vs 1원 동전 5개)

 

그리고 출력시에 주어진 동전의 합으로 K를 만들기가 불가능하다면 -1을 출력해주어야한다.