문제 링크입니다: https://www.acmicpc.net/problem/2624
거스름돈을 바꿔줄 때 해당 동전을 사용하지 않는 경우도 고려해야합니다.
따라서 (0 ~ 해당 동전의 갯수)까지 모두 고려해야 맞출 수 있는 문제였습니다.
#include <iostream>
#include <algorithm>
#include <cstring> //memset
using namespace std;
const int MAXCURRENCY = 10000 + 1; //0 < T <= 10000
const int MAX = 100;
int T, k;
pair<int, int> p[MAX]; //지폐의 금액과 개수
int cache[MAXCURRENCY][MAX];
int numOfWays(int cash, int idx) //idx는 p의 idx
{
//기저 사례
if (cash == 0)
return 1;
if (idx >= k)
return 0;
int &result = cache[cash][idx];
if (result != -1)
return result;
result = 0;
//해당 동전을 사용하지 않는 경우 + i개 사용하는 경우
for (int i = 0; i <= p[idx].second; i++)
//cash는 음수일 수 없다
if (cash - (p[idx].first * i) >= 0)
result += numOfWays(cash - (p[idx].first * i), idx + 1);
return result;
}
int main(void)
{
cin >> T >> k;
for (int i = 0; i < k; i++)
cin >> p[i].first >> p[i].second;
memset(cache, -1, sizeof(cache));
cout << numOfWays(T, 0) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1254번 팰린드롬 만들기 (0) | 2018.05.10 |
---|---|
백준 2864번 5와 6의 차이 (0) | 2018.05.10 |
백준 1328번 고층 빌딩 (0) | 2018.05.10 |
백준 1016번 제곱 ㄴㄴ 수 (0) | 2018.05.09 |
백준 1026번 보물 (0) | 2018.05.09 |