문제 링크입니다: https://www.acmicpc.net/problem/2293
다이나믹 프로그래밍이면 무조건 재귀로 풀려고 했던 모습을 반성하게 되는 문제였습니다.
조금만 생각해보면 알고리즘은 상당히 쉬웠던 문제였습니다.
/*
n가지 종류의 동전이 있다.
각각의 동전이 나타내는 가치는 다르다.
이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다.
그 경우의 수를 구하시오
*/
#include <iostream>
#include <cstring> //memset
using namespace std;
int K; //총합
int N; //동전의 개수
int coinValue[101], cache[10001];
int coin(int K)
{
memset(cache, 0, sizeof(cache));
cache[0] = 1; //0원은 모든 동전을 세지 않았을 경우(1가지)
for (int i = 0; i < N; i++)
for (int j = coinValue[i]; j <= K; j++) //K 뿐만 아니라 K 이하 합에 대해 경우의 수를 모두 구한다
cache[j] += cache[j - coinValue[i]];
return cache[K];
}
int main(void)
{
cin >> N >> K;
for (int i = 0; i < N; i++)
cin >> coinValue[i];
cout << coin(K) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1520번 내리막 길 (0) | 2018.02.05 |
---|---|
백준 2156번 포도주 시식 (0) | 2018.02.05 |
백준 1722번 순열의 순서 (0) | 2018.02.04 |
백준 10844번 쉬운 계단수 (0) | 2018.02.03 |
백준 1005번 ACM Craft (0) | 2018.02.03 |