콘서트(CONCERT) 정답 코드
뿌리튼튼 CS/Algorithm2015. 2. 26. 14:18
난이도 ★★★☆☆
틀리기 쉬운 입출력 예제
입력 | 출력 |
3 1 5 9 5 1 5 9 6 50 1 24 1 2 2 2 4 2 3 2 1 2 3 2 1 2 3 2 3 2 1 2 3 1 2 3 2 5 3 5 3 2 2 5 6 6 7 7 5 8 7 8 7 5 7 5 6 5 6 6 6 4 | 0 -1 24 |
힌트
동적계획법의 전형적인 문제이지만 문제 이해가 좀 어렵다. → 이해했다면 동적계획법의 틀(재귀함수 + 캐시)대로 구현하면 된다. |
이하는 코드입니다.
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 | #include <stdio.h> #include <string.h> #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #define FAIL -3 #define N_MAX 50 #define VM_MAX 1000 #pragma warning(disable:4996) int N, VM; int board[N_MAX]; int cache[N_MAX + 2][VM_MAX]; int getMaxVolume(int VS, int boardIndex) { if ((VS < 0) || (VS > VM)) { return FAIL; } int& ret = cache[boardIndex][VS]; if (ret != -1) { return ret; } if (boardIndex == N) { return ret = VS; } return ret = (MAX(getMaxVolume(VS + board[boardIndex], boardIndex + 1), getMaxVolume(VS - board[boardIndex], boardIndex + 1))); } int main() { int T; scanf("%d\n", &T); while (T-- > 0) { // get N, VS, VM int VS; scanf("%d %d %d", &N, &VS, &VM); // get Vi for (int i = 0; i < N; i++) { scanf("%d", &board[i]); } // solve and print memset(cache, -1, sizeof(cache)); int maxVolume = getMaxVolume(VS, 0); if (maxVolume == FAIL) { maxVolume = -1; } printf("%d\n", maxVolume); } return 0; } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
HOTSUMMER 정답 코드 (0) | 2015.04.10 |
---|---|
게임판 덮기(BOARDCOVER) 정답 코드 (0) | 2015.02.28 |
짝맞추기(MEETING) 정답 코드 (0) | 2015.02.26 |
달팽이(SNAIL) 정답 코드 (0) | 2015.02.24 |
Coin Change(COINS) 정답 코드 (0) | 2015.02.23 |