백준 동전 1 [c++]

동전 1 골드5

문제

n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다.

사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.

문제 풀이

  • 1원을 만드는 경우의 수 = 1가지
  • 2원을 만드는 경우의 수 = 2가지(1원짜리로만 2원을 만드는 방법 1가지 + 2원짜리로 2원을 만드는 방법 1가지)
  • 3원을 만드는 경우의 수 = 3가지(1원짜리로만 3원을 만드는 방법 1가지 + (1원+2원)로 3원을 만드는 방법 1가지 + 3원짜리로 3원을 만드는 방법 1가지)
  • x원인 동전을 가지고 있다면, Y원을 만들고 싶다면, DP[Y] = DP[Y] + DP[Y-X]
  • x원 짜리로 어떤 금액을 만들려면 어떤 금액은 x보다 크거나 같아야 한다.

코드

#include <iostream>
using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;
    int coin[n];
    for(int i = 0; i < n; i++)
    {
        cin >> coin[i];
    }
    int dp[k + 1];
    for(int i = 0; i <= k; i++)
    {
        dp[i] = 0;
    }
    dp[0] = 1;
    
    for(int i = 0; i < n; i++)
    {
        for(int y = coin[i]; y <= k; y++)
        {
            dp[y] += dp[y - coin[i]];
        }
    }
    cout << dp[k] << endl;

    return 0;
}

총평

  • 단순히 합이 k인 수로 dp식이 나오지 않는 문제.
  • 수단인 동전의 값으로 생각해야 함.