728x90
동전 2
https://www.acmicpc.net/problem/2294
<코드>
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 | #include <stdio.h> int main(void) { int N,K; int coinC[10001]={0,}; int coin[101]={0,}; scanf("%d %d",&N,&K); for(int i=0;i<N;i++) { scanf("%d",&coin[i]); if(coin[i]>10000) continue; coinC[coin[i]]=1; } for(int i=1;i<=K;i++){ for(int j=0;j<N;j++) { if(i-coin[j]<0) // 범위를 넘어감 { continue; } else{ if(coinC[i-coin[j]]==0) // 만들수 없는 범위다. continue; else{ if(coinC[i]==0) coinC[i] = coinC[i-coin[j]] +1; else coinC[i] = (coinC[i] < (coinC[i-coin[j]] +1)) ? coinC[i] : (coinC[i-coin[j]] +1); } } } } if(coinC[K]==0) printf("-1\n"); else printf("%d\n",coinC[K]); return 0; } | cs |
<문제 푼 요령>
1. 이 문제는 각 값어치당 만들 수 있는 동전의 최소값을 DP 테이블로 만들어서 푸는 문제이다.
2. 즉 우리가 원하는 값까지 차례대로 DP 테이블을 채워가면서 만들어 원하는 값을 구하면 된다.
3. 채워가는 경우를 예를 들어서 한 코인의 가치를 K라고 하고 우리가 원하는 값이 M 이라고 하면 우리는 DP[M] = DP[M-K] + 1 이 최소값이 될 수 있게된다. 하지만 다양한 가치를 가진 코인이 있기 떄문에 이 코인의 경우를 다 따져서 그 중 최소값을 DP[M]에 넣어주면 된다.
4. 우리가 가진 코인의 조합으로 만들수 없는 경우를 찾기위해 처음의 배열을 0으로 초기화하고 코인 한개만 들어갈 경우를 미리 1로 만들어 놓았다. 만약 위의 예시되로 하자면 DP[M-K] 자체가 0이라고 가정하면 이 경우는 K라는 값어치를 가진 코인을 가지고는 M값어치를 가지는 경우의 수를 만들 수 없다라고 생각할 수 있다.
5. 그리고 내가 문제를 풀다가 실수 해서 자꾸 틀린경우가 있는데 바로 코인의 값어치가 10000을 넘어버려서 런타임 에러가 나는 것이였다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][1937번][DP] 욕심쟁이 판다 (5) | 2016.10.04 |
---|---|
[백준][2096번][DP] 내려가기 (0) | 2016.10.01 |
[백준][1509번][DP] 팰린드롬 분할 (0) | 2016.04.15 |
[백준][10942번][DP] 펠린드롬? (0) | 2016.04.15 |
[백준][11048번][DP] 이동하기 (0) | 2016.04.15 |
댓글