Coin Change(COINS) 정답 코드
뿌리튼튼 CS/Algorithm2015. 2. 23. 18:04
난이도 ★★★☆☆
힌트
전형적인 동적계획법 문제 → 완전 탐색 + 캐시 사용 |
이하는 코드입니다.
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #define C_MAX 100 #define M_MAX 5000 #define MOD_AMOUNT 1000000007 #pragma warning(disable:4996) using namespace std; vector<int> coins; int cache[M_MAX][C_MAX]; int getCount(int money, int maxCoinIndex) { int& ret = cache[money][maxCoinIndex]; if (ret != -1) { return ret; } // case found if (money == 0) { return ret = 1; } // if this is a leaf node if (maxCoinIndex == 0) { if (money % coins[maxCoinIndex] == 0) { return ret = 1; } return ret = 0; } // non-leaf node ret = 0; for (int pSum = 0; pSum <= money; pSum += coins[maxCoinIndex]) { ret = (ret + getCount(money - pSum, maxCoinIndex - 1)) % MOD_AMOUNT; } return ret; } int main() { int T; scanf("%d\n", &T); while (T-- > 0) { // get M, C int M, C; scanf("%d %d", &M, &C); // get sorted coins coins.clear(); for (int i = 0; i < C; i++) { int coin; scanf("%d", &coin); coins.push_back(coin); } sort(coins.begin(), coins.end()); // solve and print memset(cache, -1, sizeof(cache)); printf("%d\n", getCount(M, C - 1)); } return 0; } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
짝맞추기(MEETING) 정답 코드 (0) | 2015.02.26 |
---|---|
달팽이(SNAIL) 정답 코드 (0) | 2015.02.24 |
최소, 최대 정사각형 찾기 1(MMRECT1) 정답 코드 (0) | 2015.02.16 |
Microwaving Lunch Boxes(LUNCHBOX) 정답 코드 (0) | 2015.02.12 |
회전초밥(SUSHI) 정답 코드 (0) | 2015.02.10 |