KimMK

2294(동전2) 본문

Baekjoon/동적계획법(DP)

2294(동전2)

KimMK 2023. 4. 4. 19:08

난이도: 골드 5

 

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

 

2294번: 동전 2

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

www.acmicpc.net

 

문제

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

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

입력

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

출력

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

 

 

풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 10001
#define INF 100001

int n, k;
int dp[MAX];

int main()
{
	cin >> n >> k;

	vector<int> coin(n);
	for (int i = 0; i < n; i++)
		cin >> coin[i];

	sort(coin.begin(), coin.end());
	
	for (int i = 1; i <= k; i++)
		dp[i] = INF;

	for (int i = 0; i < n; i++)
	{
		for (int j = coin[i]; j <= k; j++)
			dp[j] = min(dp[j], dp[j - coin[i]] + 1);
	}

	if (dp[k] == INF)
		cout << -1 << "\n";
	else
		cout << dp[k] << "\n";
}

'Baekjoon > 동적계획법(DP)' 카테고리의 다른 글

2225(합분해)  (0) 2023.05.30
11048(이동하기)  (0) 2023.04.04
2133(타일 채우기)  (0) 2023.03.25
1937(욕심쟁이 판다)  (0) 2023.03.23
11660(구간 합 구하기5)  (0) 2023.02.23