본문 바로가기

Algorithm/BeakJoon

[BeakJoon 2204] 동전 2

안녕하세요. 이번 포스팅에서는 백준 2204 동전 2 문제를 풀어보도록 하겠습니다.

 

해당 문제는

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

 

2294번: 동전 2

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

www.acmicpc.net

 

위 링크에서 확인하실 수 있습니다.

 

 

동전의 조합을 사용하여 만들 수 있는 가치의 최솟값을 묻는 문제입니다.

 

이러한 류의 문제는 보통 Dynamic Programming으로 접근이 가능합니다.

 

2중 루프를 돌며,

 

첫 번째 루프에서는 동전의 가치를

두 번째 루프에서는 0부터 만드려는 최종적인 가치를 돌면서, 

 

현재 값이 현재 동전을 사용하여 만들 수 있는 경우라면,

현재 값에 저장되어있는 개수현재 동전을 사용하기 전의 가치 + 1 중 최솟값을 저장해주시면 됩니다.

 

코드를 보시면 훨씬 이해가 빠르실거라 생각합니다.

 

<소스 코드>

#include <bits/stdc++.h>
using namespace std;

int n, k, dp[100004];
vector<int> v;
int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> n >> k;
	
	for(int i = 0; i < n; i++) {
		int a; cin >> a;
		v.push_back(a);
	}
	
	fill(dp, dp+100004, 1e9);
	for(auto coin : v) dp[coin] = 1;
	for(auto coin : v) {
		for(int j = 0; j <= k; j++) {
			if(j-coin >= 0) dp[j] = min(dp[j-coin]+1, dp[j]);
		}
	}
	if(dp[k]!=1e9)cout << dp[k];
	else cout<<"-1";
	
	return 0;
}

 

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다. 

'Algorithm > BeakJoon' 카테고리의 다른 글

[BeakJoon 17471] 게리맨더링  (0) 2021.09.26
[BeakJoon 2293] 동전 1  (0) 2021.09.08
BeakJoon 15591 MooTube (Silver)  (0) 2021.09.01
[BeakJoon 1480] 보석 모으기  (0) 2021.08.30
[BeakJoon 2042] 구간 합 구하기  (0) 2021.08.22