[ 백준 ] 2293 / 동전 1

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
108/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2293 / 동전 1
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - dp[i][j] = [1,i] 번째의 동전을 사용해서 j 원을 나타낼 수 있는 경우의 수
 *   + 근데 메모리가 4MB 밖에 안되네...?
 *   # dp[j] = j 원을 나타낼 수 있는 경우의 수로 표현하자
 *     사용한 동전의 종류는 for 문에서 처리하도록 하자
 *
 * Point
 * - dp[i][j] 로 구현하면,
 *   + dp[i][j] = dp[i-1][j]
 *     if (j >= C[i]) dp[i][j] += dp[i][j-C[i]]
 *   dp[j] 로 구현하면,
 *   + if (j >= C[i]) dp += dp[i][j-C[i]]
 *   # 굳이 dp[i][j] = dp[i-1][j] 를 해주지 않아도 된다
 *
 * - dp[0] = 1
 *   + 1원, 5원 짜리 동전이 있고 10원을 표현하는 가짓수,
 *     (1원 : 10개, 5원 : 0개)
 *     (1원 : 5개,  5원 : 1개)
 *     (1원 : 0개,  5원 : 2개)
 *   + 그렇다면 1원, 5원 짜리 동전이 있고 0원을 표현하고 싶다면,
 *     (1원 : 0개, 5원 : 0개)
 *     그래서 dp[0] = 1 이다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <cstring>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, K;
    cin >> N >> K;
    int C[N+1];
    for (int i=1; i<=N; i++) {
        cin >> C[i];
    }

    // Process
    int dp[K+1];
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;
    for (int i=1; i<=N; i++) {
        for (int j=1; j<=K; j++) {
            /* 이 순간에 dp[j]는 [1,i-1] 번째의 동전을 사용해서 j 원을 만드는 가짓수를 뜻함 */
            if (j >= C[i]) {
                dp[j] += dp[j-C[i]];
            }
            /* 이제 dp[j]는 dp[j] = [1,i] 번째의 동전을 사용해서 j 원을 만드는 가짓수를 뜻함 */
        }
    }

    // Control : Output
    /* dp[K] = [1,N] 번째의 동전을 사용해서 K 원을 만드는 가짓수 */
    cout << dp[K] << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글