https://www.acmicpc.net/problem/2294
동전2 문제는 최소의 동전을 써서 k원을 만드는 문제입니다.
dp[n] = n원을 만드는데 드는 최소의 동전 수
라고 정의를 하면 쉽습니다.
그렇다면 점화식은
dp[n] = dp[n - coin[i]] + 1
이 되겠지요???
근데 여기서 조심해야할 것은 두가지가 있습니다!
1. n에서 코인을 뺏을 떄 -가 될 수 있다.
2. n - coin[i]가 만들 수 없는 경우일 때 1을 더하는 것..
이 두가지만 조심한다면 간단한 문제입니다.
아래 코드입니다.
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 32 33 34 35 36 37 38 39 | #include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <string.h> #include <vector> #include <functional> #define MAX_SIZE 100 #define INF 0x7fffffff using namespace std; int coin[MAX_SIZE]; int dp[10001]; int main() { int n, k; scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) scanf("%d", coin + i); for(int i = 1; i <= k; i++) { dp[i] = INF; for(int j = 0; j < n; j++) { int before = i - coin[j]; if(before >= 0 && dp[before] != INF) dp[i] = min(dp[i], dp[before] + 1); } } printf("%d\n", dp[k] == INF ? -1 : dp[k]); return 0; } | cs |
'알고리즘 > 다이나믹 프로그래밍(DP)' 카테고리의 다른 글
[2133] 타일 채우기 (0) | 2017.04.20 |
---|---|
[1309] 동물원 (0) | 2017.04.20 |
[2293] 동전 1 (4) | 2017.04.19 |
[1727] 커플 만들기 (0) | 2017.04.05 |
[2240] 자두나무 (0) | 2017.04.05 |