거의 알고리즘 일기장

백준 2294번 _ 동전 2 본문

알고리즘 문제풀이

백준 2294번 _ 동전 2

건우권 2020. 5. 9. 19:30

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

 

2294번: 동전 2

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

www.acmicpc.net

풀이방법

메모제이션 문제, 거의 동일한 방식으로 푼 밑의 풀이를 참고.

https://kunkunwoo.tistory.com/100

 

백준 2293번 _ 동전 1

https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작..

kunkunwoo.tistory.com


전체코드 ( 반복문 풀이 )

#include <iostream>
#include <algorithm>
#include <vector>

#define INF 987654321

using namespace std;
int dp[10001];
vector<int>coins;
int n, k;

void dpInit()
{
	for (int i = 1; i <= k; i++)
		dp[i] = INF;
}

void Input()
{
	cin >> n >> k;
	coins.resize(n+1);
	for (int i = 1; i <= n; i++)
		cin >> coins[i];
	sort(begin(coins), end(coins));
}

void solve()
{
	for (int i = 1; i <= n; i++)
	{
		int coin = coins[i];
		for (int j = 1; j <= k; j++)
		{
			if (j % coin == 0)
				dp[j] = min(j / coin, dp[j]);
			
			if (dp[j] == INF)
				continue;
				
			if (j + coin <= k)
				dp[j + coin] = min(dp[j + coin], dp[j] + 1);
		}
	}
}

int main()
{
	Input();
	dpInit();
	solve();
	if (dp[k] == INF)
		cout << -1 << '\n';
	else
		cout << dp[k];
	return 0;
}

 


 

반응형
Comments