알고리즘

[C++] 백준 2294번 동전 2

J3SUNG 2019. 5. 27. 16:33
728x90

 

다이나믹 프로그래밍 문제입니다.

 

n개의 동전을 가지고 k원을 만들때

최소한의 동전의 개수를 구하는 문제입니다.

 

작은 동전부터 큰 동전 순으로 1~k원을 구할때 드는 동전 수를 구합니다.

그리고 만약 이미 값을 저장한 곳에 값이 있으면 현재 동전의 수가 더 작으면 값을 변경해줍니다.

이를 코드로 하면 이와 같습니다.

memo[j] = min(memo[j], memo[j - coin[i]] + 1);

 

#include <iostream>
#include <algorithm>
using namespace std;

int main(int argc, char *argv[])
{
   int coinNum;
   int findCoin;
   int coin[10010] = { 0, };
   int memo[100010] = { 0, };
   cin >> coinNum;
   cin >> findCoin;

   for (int i = 1; i <= coinNum; ++i) {
      cin >> coin[i];
   }

   for (int i = 1; i <= coinNum; ++i) {
      int j = coin[i] + 1;
      memo[coin[i]] = 1;
      for (; j <= findCoin; ++j){
         if (memo[j - coin[i]] == 0) {
            continue;
         }
         if (memo[j] == 0) {
            memo[j] = memo[j - coin[i]] + 1;
         }
         memo[j] = min(memo[j], memo[j - coin[i]] + 1); 
      }
   }
   if (memo[findCoin] == 0) {
      cout << "-1" << endl;
   }
   else {
      cout << memo[findCoin] << endl;
   }

   return 0;
}