컨셉:
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 <= 0) return (money == 0);
if(index < 0) return 0;
int& ret = cache[index][money];
if(ret != -1) return ret;
if(index == 0) return 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, -1, sizeof(cache));
for(int i = 0; i< N; i++) cin >> coins[i];
cin >> MONEY;
cout << pay(N-1, MONEY) << endl;
}
}
|
cs |
'Study > Algorithm' 카테고리의 다른 글
[동적계획법] 13. 두니발 박사의 탈옥 - 오답 (0) | 2019.08.16 |
---|---|
[동적계획법] 12. 폴리오미노 (0) | 2019.08.13 |
[동적계획법] 11. 비대칭 타일링 (0) | 2019.08.12 |
[동적계획법] 10.달팽이 (0) | 2019.08.12 |
[동적계획법] 9. 삼각형 위의 최대 경로 수 (0) | 2019.08.08 |