알고리즘 문제 풀이/백준

[백준] DP 2293번 동전1 C++ 풀이

다락공방 2024. 9. 3. 17:46

문제

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

 

동전1, 2로 두개 문제가 있는데 오랜만에 다시볼라니까 좀 헷갈려서 정리한다.

참고로 9084번 동전 문제도 똑같은 문제이다.


 

풀이

동전1의 경우 주어진 금액에 맞게 주어진 동전들을 이용해 만들 수 있는 경우의 수를 세는 것이다. 

여기서 생각해봐야할 점은 문제에도 나와있듯

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

에는 동일한 경우의 수이다.

4원을 만들때, 1,3원짜리 화폐가 있으면 1+3이나 3+1이나 동일하다는 것이다.

이 두 경우를 다르게 본다면 DFS나 BFS를 이용할 수 있을 것이다.

 

여기선 동일한 경우로 따지기때문에, 1이 먼저오는 경우를 미리 판단한다고 생각한다. 그렇게한다면 DP배열의 1로가는 경우의 수를 먼저 대입한다. 

dp[0] = 1;
    for (int i = 0; i < coin.size(); ++i) {
        for (int j = coin[i]; j <= k; ++j) {
            dp[j] = dp[j] +dp[j - coin[i]];
        }
    }

 

처음엔 coin 배열이 오름차순이어야 된다고 생각했는데, 어떤식의 정렬이든 1이 먼저인지 3이 먼저인지만 다를뿐 결과는 같다. 

 

 

 


 

소스코드

#include <bits/stdc++.h>

using namespace std;

const int INF = 10001;
int n, k;
vector <int> coin;
int dp[10001];
int main(){
    cin >> n >> k;
    int num;
    for (int i = 0; i < n; ++i) {
        cin >> num;
        coin.push_back(num);
    }
    dp[0] = 1;
    for (int i = 0; i < coin.size(); ++i) {
        for (int j = coin[i]; j <= k; ++j) {
            dp[j] = dp[j] +dp[j - coin[i]];
        }
    }

    cout << dp[k];
}