본문 바로가기

Algorithm

[백준/DP] 2294 - 동전 2

동전 2 성공

문제

n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

입력

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

출력

첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.

예제 입력 1 복사

3 15 1 5 12

예제 출력 1 복사

3

 

https://www.acmicpc.net/problem/2294

 

2294번: 동전 2

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

www.acmicpc.net


내 소스

#include <iostream>

using namespace std;

int main(){
	int n; // 동전 종류 수 (1 ≤ n ≤ 100) 
	int k; // 만드려는 가치의 합 (1 ≤ k ≤ 10,000)
	// 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
	int *arr;
	int *DP;
	int i;
	int j;
	
	cin >> n;
	cin >> k;
	arr = new int[n];
	DP = new int[k+1];
	
	for(i=0; i<n; i++){
		cin >> arr[i];
	}
	
	for(i=0; i<k+1; i++){
		DP[i] = k+1;
	}
	
	for(i=0; i<n; i++){
		for(j=1; j<=k; j++){
			if(arr[i] == j){
				DP[j] = 1;
			}else if(arr[i] < j){
				DP[j] = min(DP[j], DP[j - arr[i]]+1);
			}
        }
	}
	
	if(DP[k] == k+1){
		cout << -1;
	}else{
		cout << DP[k];
	}
	
	return 0;
}

'Algorithm' 카테고리의 다른 글

[백준/배열] 4344 - 평균은 넘겠지  (0) 2021.03.27
[백준/DP] 9084 - 동전  (0) 2020.02.01
[백준/DP] 14501 - 퇴사  (0) 2020.01.26
[백준/DP] 1915 - 가장 큰 정사각형  (0) 2020.01.21
[백준/DP] 1912 - 연속합  (0) 2020.01.21