본문 바로가기

Programming

Algospot - [COINS] CoinChange

Coin Change

문제

우리 나라에는 10원, 50원, 100원, 500원의 네 가지 동전이 있다. (1원짜리와 5원짜리는 거의 안 쓰니까 없는 걸로 하지요) 이 동전들을 이용해 110원을 거슬러 주는 방법은 몇 가지나 될까? 다음의 네 가지가 있다:

  • 10원 짜리 11개
  • 10원짜리 6개, 50원짜리 1개
  • 10원짜리 1개, 50원짜리 2개
  • 10원짜리 1개, 100원짜리 1개

금액이 커지거나 동전의 종류가 많아질 수록 이 경우의 수는 많아진다. 동전의 종류와 금액이 주어질 때, 해당 동전들을 이용해 해당 금액을 환전하는 방법의 수를 구하는 프로그램을 작성하라.

입력

입력의 첫 줄에는 테스트 케이스의 수 T (1 <= T <= 100) 가 주어진다. 각 테스트 케이스의 첫 줄에는 환전할 금액 M (1 <= M <= 5000) 과 동전 종류의 개수 C (1 <= C <= 100) 가 주어진다. 그 다음 줄에, C 개의 정수로 각 동전 종류별 금액이 주어진다. 동전의 금액은 5000 이하의 자연수이다.

출력

각 테스트 케이스마다, 해당 금액을 환전할 수 있는 경우의 수를 출력한다. 경우의 수가 1000000007 보다 큰 경우, 1000000007 으로 나눈 나머지를 출력한다.

예제 입력

4
110 4
10 50 100 500
850 4
10 50 100 500
3600 5
100 300 500 900 2000
1278 8
1 2 4 8 16 32 64 128

예제 출력

4
110
130
873794561



#include <stdio.h>
int testCase, nowCase;
int money, coinCount;
long int d[5002];
int coin[1002];
long int result[102];
void problem(){
    int i=0, j=0;
    d[0]=1;
    for(i=1; i<=money; i++){
        d[i]=0;
    }
    for(i=0; i<coinCount; i++){
        for(j=coin[i]; j<=money; j++){
            d[j]+=d[j-coin[i]]%1000000007;
        }
    }
    result[testCase-nowCase-1]=d[money]%1000000007;;
}
void printResult(){
    int i=0;
    for(i=0; i<testCase; i++){
        printf("%ld\n", result[i]);
    }
}
void inputValue(){
    int i=0;
    scanf("%d %d\n", &money, &coinCount);
    for(i=0; i<coinCount; i++){
        scanf("%d", &coin[i]);
    }
    getchar();
}
int main()
{
    int i=0;
    scanf("%d\n", &testCase);
    nowCase=testCase;
    while(nowCase--){
        inputValue();
        problem();
    }
    printResult();
    return 0;
}


'Programming' 카테고리의 다른 글

[C/C++]Combination 함수에 대해 고민해보기  (0) 2016.05.06
C/C++ extern memset strcpy  (0) 2014.07.26
C/C++ argc, argv  (0) 2014.07.26
VS2012 MFC 프로젝트 생성  (0) 2014.07.12
gcc 기본  (0) 2014.07.01