[#78][알고리즘] 동전 1

백준 > 동전 1

문제 링크(https://www.acmicpc.net/problem/2293)

문제

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

입력

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

출력

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

예제 입력 1 

3 10
1
2
5

예제 출력 1 

10
C++풀이
#include <iostream>
using namespace std;
int main() {
    int n, k, dp[10001= { 0 }, input[101= { 0 };
    cin >> n >> k;
    
    dp[0= 1;
    for (int i = 1; i <= n; i++) {
        //동전 개수만큼 입력받기
        cin >> input[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = input[i]; j <= k; j++) {
//예, 2원으로는 1원을 만들지 못함
            dp[j] += dp[j - input[i]];
        }
    }
    //답 출력    
    cout << dp[k] << endl;
    return 0;
}
cs
해결 방법 => 점화식 세우기
d[j] += d[j - input[i]]

k = 10일 때
▶ 1원짜리 동전으로 채우는 경우의 수 = 1
(1 1 1 1 1 1 1 1 1 1)

▶ 1원, 2원짜리 동전으로 채우는 경우의 수 = 1 + 5(10-2까지의 경우의 수) = 6
(1 1 1 1 1 1 1 1 1 1)
(1 1 1 1 1 1 1 1 2)
(1 1 1 1 1 1 2 2)
(1 1 1 1 2 2 2) 
(1 1 2 2 2 2)
(2 2 2 2 2)

▶ 1원, 2원, 5원짜리 동전으로 채우는 경우의 수 = 6 + 4(10-5까지의 경우의 수) = 10
(1 1 1 1 1 1 1 1 1 1)
(1 1 1 1 1 1 1 1 2)
(1 1 1 1 1 1 2 2)
(1 1 1 1 2 2 2)
(1 1 2 2 2 2)
(2 2 2 2 2)
(1 1 1 1 1 5)
(1 1 1 2 5)
(1 2 2 5) 
(5 5)



댓글

가장 많이 본 글