본문 바로가기

Study/Algorithm

[백준] 9084. 동전

컨셉:

int pay(int index, int money)   //coins[0] ~ coins[index]까지의 동전만을 써서 money원을 만들 수 있는 방법의 수

⇒ pay(index, money) = ∑pay(index -1, money - coin[index]로 지불한 금액) 

 

내 코드(정답, 8ms)

...더보기

 

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
/**
 * @name    동전
 * @ID      9084
 * @date    2019-08-12
 * @author  Sunmon
 */
 
#include <iostream>
#include <cstring>
 
 
using namespace std;
int N, MONEY;
int coins[20];
int cache[20][10000+1]; 
 
 
//coins[0] ~ coins[index]까지의 동전만을 써서 money원을 만들 수 있는 방법의 수 리턴
int pay(int index, int money)
{
 
    //base case
    if(money <= 0return (money == 0);
    if(index <  0return 0
 
    int& ret = cache[index][money];
    if(ret != -1return ret;
    if(index == 0return ret =  (money % coins[index] == 0);
 
    int amount = 0;     //coins[index]로 지불하는 금액
    ret = 0;            //지불하는 방법의 수
    while(amount <= money)
    {
        ret += pay(index-1, money-amount);
        amount += coins[index];
    }
 
    return ret;
}
 
 
int main()
{
    int C;
    cin >> C;
    while(C--)
    {
        cin >> N;
        memset(cache, -1sizeof(cache));
        for(int i = 0; i< N; i++cin >> coins[i];
        cin >> MONEY;
        cout << pay(N-1, MONEY) << endl;
 
    }
}
cs