※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 9084번 문제인 동전이다.
문제는 아래 링크를 확인하자.

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

 

9084번: 동전

우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는

www.acmicpc.net

전형적인 knapsack 문제이다. knapsack DP를 이용하여 문제를 해결하자.

 

구체적으로, 화폐가 A1 A2 ... A20가 있을 때 액수 M을 만드는 경우의 수는 다음과 같이 쪼갤 수 있다:

1. A1만을 이용하여 M-A1을 만드는 경우의 수 + A1화폐 추가

2. A1과 A2만을 이용하여 M-A2를 만드는 경우의 수 +  A2화폐 추가

3. A1, A2, A3만을 이용하여 M-A3을 만드는 경우의 수 + A3화폐 추가

...

20. A1, ..., A20만을 이용하여 M-A20을 만드는 경우의 수 + A20화폐 추가

 

위의 내용을 이용하여 DP로 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cstring>
using namespace std;

int val[20001];

void solve() {
	memset(val, 0, sizeof(val));
	val[0] = 1;
	int N; cin >> N;
	while (N--) {
		int x; cin >> x;
		for (int i = 0; i < 10001; i++) {
			val[i + x] += val[i];
		}
	}
	int M; cin >> M;
	cout << val[M] << '\n';
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	while (T--) {
		solve();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 14941 // C++] 호기심  (0) 2022.05.31
[BOJ 5626 // C++] 제단  (0) 2022.05.30
[BOJ 9047 // C++] 6174  (0) 2022.05.29
[BOJ 4641 // C++] Doubles  (0) 2022.05.29
[BOJ 9046 // C++] 복호화  (0) 2022.05.29

+ Recent posts