GitHubSeob
C++ / 백준 / 2293 / 동전 1 본문
문제
https://www.acmicpc.net/problem/2293
2293번: 동전 1
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
www.acmicpc.net
문제풀이
처음에는 단순히 DP[10] = DP[10-1] + DP[10-2] + DP[10-5]를 하려고 했다.
하지만 이렇게 누적시키게 되면 숫자 구성은 같지만 순서만 다른 것도 포함이 되므로 틀린 답이다.
동전 단위 개수만큼 반복문을 돌리고, n원부터 k원 까지 DP[x] = DP[x-n]값을 누적시킨다.
처음 n원으로 n원을 만들때 DP[n]=DP[n-n]일 때, DP[0]의 값을 사용하므로 DP[0]=1으로 설정한다.
표로 보면 이해가 더 쉬울것같아 2개의 예시를 가져왔다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n = 0;
int k = 0;
int x = 0;
int cnt = 0;
cin >> n >> k;
vector<int>DP(k + 1, 0);
vector<int>coin(n, 0);
for (x = 0; x < n; ++x) {
cin >> coin[x];
}
DP[0] = 1;
for (cnt = 0; cnt < n; ++cnt) {
for (x = coin[cnt]; x <= k; ++x) {
DP[x] += DP[x - coin[cnt]];
}
}
cout << DP[k];
}
'Baekjoon > Silver' 카테고리의 다른 글
C++ / 백준 / 2156 / 포도주 시식 (0) | 2021.08.07 |
---|---|
C++ / 백준 / 11053 / 가장 긴 증가하는 부분 수열 (0) | 2021.08.06 |
C++ / 백준 / 9465 / 스티커 (0) | 2021.08.06 |
C++ / 백준 / 2193 / 이친수 (0) | 2021.08.06 |
C++ / 백준 / 2644 / 촌수계산 (0) | 2021.08.05 |