[백준 알고리즘] 2293번: 동전1

https://www.acmicpc.net/problem/2293

문제

문제

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

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

입력

첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 경우의 수를 출력한다. 경우의 수는 2^31보다 작다.

풀이

DP 문제였다. DP는 아무래도 점화식을 짜는 것이 중요한데, 나는 어떤 수 i 가 있을 때, i를 만들 수 있는 경우의 수는 i - (각 동전 값) 의 경우의 수에 해당 동전을 더하는 것과 같다. 따라서 모든 동전을 입력해두고 하나씩 꺼내면서 i - 동전 값의 경우의 수를 모두 더해주면 된다.

코드

' '
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int const MAX = 10001;

int dp [MAX];

int main (){
    int n, k;
    vector<int> coins;

    scanf("%d %d", &n, &k);

    while(n--){
        int coin;
        scanf("%d", &coin);
        coins.push_back(coin);
    }

    dp[0] = 1;
    for (auto coin : coins){
        for (int i = coin ; i <= k ; i++){
            dp[i] += dp[i - coin];
        }
    }

    printf("%d", dp[k]);
}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.