https://www.acmicpc.net/problem/2624
2624번: 동전 바꿔주기
명보네 동네 가게의 현금 출납기에는 k 가지 동전이 각각 n1, n2, … , nk개 씩 들어있다. 가게 주인은 명보에게 T원의 지폐를 동전으로 바꿔 주려고 한다. 이때, 동전 교환 방법은 여러 가지가 있을
www.acmicpc.net
[풀이] DP
dp 정의 : dp[n] = n원을 동전으로 교환하는 경우의 수.
i : 0 ~ K-1까지 모든 동전 종류를 순회하면서
i 번째 동전까지 썼을때의 dp[j] (j : T~1) 을 구해준다.
T부터 거꾸로 하는 이유가 중요한데
1부터 할 경우 dp[1~j-1] 이 dp[j] 에 포함될 수 있기 때문이다.
dp[1~j-1]에는 i번째 동전을 쓰는 경우의 수까지 포함되어 있어서 dp[j]에는 포함되면 안된다.
동전 i를 몇개 선택할지 정해야 하기 때문에 동전 개수만큼 순회하면서 sum에 더해주고
if(j-sum >= 0 && dp[j-sum] > 0 을 만족하는 k를 찾으면 dp[j]에 dp[j-sum]을 더해주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <cstdio>
int T, K, P[1001], cnt[1001],dp[10001];
int main() {
scanf("%d%d", &T, &K);
for (int i = 0; i < K; i++) scanf("%d%d", &P[i], &cnt[i]);
dp[0] = 1;
for (int i = 0; i < K; i++) {
for (int j = T; j >= 1; j--) {
int sum = 0;
for (int k = 0; k < cnt[i]; k++) {
sum += P[i];
if (j - sum >= 0 && dp[j-sum] > 0) dp[j] += dp[j - sum];
}
}
}
printf("%d",dp[T]);
}
|
cs |
https://github.com/has2/Algorithm/blob/master/boj/RANDOM_PROBLEM/2624.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 10830 : 행렬 제곱(C++) (0) | 2020.12.12 |
---|---|
[BOJ/백준][Gold4] 1403 : 거짓말(C++) (0) | 2020.12.12 |
[BOJ/백준][Gold4] 1022 : 소용돌이 예쁘게 출력하기 (C++) (0) | 2020.12.12 |
[BOJ/백준] 2143: 두 배열의 합(C++) (0) | 2020.07.05 |
[BOJ/백준] 2632 : 피자판매 (C++) (0) | 2020.06.30 |