해당 문제는 백준 사이트에서 풀 수 있습니다.
1. 문제
n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다.
이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오.
각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다.
동전의 가치는 100,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 경우의 수를 출력한다. 경우의 수는 2^31보다 작다.
예제 입력 1 3 10 1 2 5 |
예제 출력 1 6 |
2. 조건
1. N개의 동전이 주어진다.
2. N개의 동전은 각각 금액이 다르다.
3. N개의 동전으로 만들 수 있는 K값을 구하여라.(즉, 경우의 수를 모두 구하면 된다.)
3. 풀이
이 문제 또한 dp 문제입니다.
해당 문제는 프로그래머스의 거스름돈 문제와 같은 문제입니다.
programmers.co.kr/learn/courses/30/lessons/12907
배열에 해당 동전으로 만들 수 있는 경우의수를 계쏙 해서 더해주는 방식으로 풀면 됩니다.
처음에 1로 만들 수 있는 경우의 수는 1가지 뿐입니다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2로 만들 수 있는 경우의 수는 다음과 같습니다.
1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
하지만 1과 2로 만들 수 있는 경우의 수는 다음과 같습니다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
즉, dp[i] = dp[i] + dp[i - Coin] 이 됩니다.
이건 직접 써보면서 이해하시길 바랍니다..... 저도 그렇게 이해해서..... ㅠㅠ
4. 코드
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#pragma warning(disable: 4996)
using namespace std;
int main() {
int N, COST;
cin >> N >> COST;
vector<int> v(N);
vector<int> dp(COST + 1);
for (int i = 0; i < N; i++)
scanf("%d", &v[i]);
dp[0] = 1;
for (int i = 0; i < v.size(); i++) {
for (int j = v[i]; j <=COST; j++) {
dp[j] = dp[j] + dp[j - v[i]];
cout << dp[j] << " ";
}
cout << endl;
}
cout << dp[COST] << endl;
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
백준 14502] C++ 연구소 (0) | 2020.12.22 |
---|---|
백준 2565] C++ 전깃줄 (3) | 2020.12.08 |
백준 11047] C++ 동전 0 (0) | 2020.12.01 |
백준 1662] C++ 압축 (0) | 2020.11.24 |
백준 2304] C++ 창고 다각형 (0) | 2020.11.23 |
댓글