티스토리 뷰

알고리즘/백준

백준 / 2294 동전 2 C++

4567은 소수 2021. 1. 12. 01:18

www.acmicpc.net/problem/2294

 

2294번: 동전 2

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

www.acmicpc.net

전형적인 dp문제이다. 

우선 0~k원까지 전부 inf로 초기화 한다. 그리고 dp[동전 가치]=1로 잡는다. (1개로 만들수 있으므로)

그러면 점화식이 다음과 같다.

 

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

여기서 j는 구하고자 하는 가치이다. 

우선 우리는 dp를 inf로 초기화하였고, 동전의 개수 제한이 없으므로, i번째 동전을 1개씩 더하여 그 가치를 만들 수 있으면 +1을 하면 된다. 

그리고 j+coin[i] > k 를 만족하면 그 뒤 결과는 coin[i]를 더해도 k를 다 넘으므로 break 시킨다.  

이를 반복하면 된다.

ex) dp[6] = inf  =>  동전 가치가 1인 녀석을 반복 => dp[6] = 6 => coin=5일 때, dp[5]=1

=> dp[6] = min(dp[6], dp[5]+1) = 2

 

코드를 보는게 더 이해가 잘 될 듯 싶다. 

 

코드는 다음과 같다.

#include<iostream>
#include<algorithm>

using namespace std;

int n, k;
int coin[101];
int dp[100001];


int main()
{
	cin >> n >> k;
	
	int inf = 987654321;
	for (int i = 0; i <= k; i++)
		dp[i] = inf;

	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;
		coin[i] = num;
		dp[num] = 1;
	}

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

	if (dp[k] == inf)
		cout << -1;
	else
		cout << dp[k];
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 10836 여왕벌 C++  (0) 2021.01.18
백준 / 11437 LCA C++  (0) 2021.01.13
백준 / 1182 부분수열의 합 C++  (0) 2021.01.09
백준 / 2437 저울 C++  (0) 2021.01.06
백준 / 17144 미세먼지 안녕! C++  (0) 2021.01.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함