백준 Baekjoon

[C++] 백준 2293 : 동전 1

sujo 2020. 12. 22. 17:43

백준 2293 : 동전 1

 

문제 링크

www.acmicpc.net/problem/2293

 

2293번: 동전 1

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

www.acmicpc.net

 

 

문제 내용

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

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

 

 

Idea

다이나믹 프로그래밍을 하여 코드를 구현한다.

 

f(n) += f(n-coin) 임을 이용한다.

이때, f(n-coin)을 더해주는 이유는 현재의 가치에서 해당 동전을 사용한다 했을 때 남은 가치의 경우의 수를 더해주기 위함이다.

 

아래 표는 각 가치에 대한 경우의 수를 나타낸 것이다.

  1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1 1
2 1 2 2 3 3 4 4 5 5 6
5 1 2 2 3 4 5 6 7 8 10

 

 

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int dp[100001];
 
int main() {
    int n, k;
    scanf("%d %d"&n, &k);
 
    //동전 배열 크기 동적 할당
    int* coin = new int[n];
 
    //동전의 가치 입력
    for (int i = 0; i < n; i++)
        scanf("%d"&coin[i]);
 
    //경우의 수 구하기
    dp[0= 1;
    for (int i = 0; i < n; i++) {
        for (int j = coin[i]; j <= k; j++) {
            dp[j] += dp[j - coin[i]];
        }
    }
 
    printf("%d\n", dp[k]);
    return 0;
}
cs

 

 

 

 

'백준 Baekjoon' 카테고리의 다른 글

[C언어] 백준 1012 : 유기농 배추  (0) 2021.01.19
[C++] 백준 1966 : 프린터 큐  (0) 2021.01.07
[C++] 백준 11399 : ATM  (0) 2020.12.14
[C++] 백준 5568 : 카드 놓기  (0) 2020.12.07
[C++] 백준 1931 : 회의실배정  (0) 2020.12.03