Study hard
(c++)백준 2294번: 동전 2 본문
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주��
www.acmicpc.net
[풀이]
DP로 풀 수 있는 문제였다.
DP[x]: 가치의 합 x를 얻기 위해 사용한 동전의 최소 개수
점화식
if coin[i] <= j : DP[j] = min(DP[j], DP[j-coin[i]]+1)
※처음에 memset으로 DP의 모든 원소를 9999999로 초기화 하려고 했지만 틀렸습니다가 나왔다.
0이나 -1로 초기화 하는 게 아니면 fill을 쓰는걸로..
#include <iostream>
//#include <cstring>//memset
#include <algorithm>//min, fill
using namespace std;
int n, k;
int DP[10001];
int coin[101];
void solution() {
DP[0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
if (coin[i] <= j) {
DP[j] = min(DP[j], DP[j - coin[i]] + 1);
}
}
}
if (DP[k] == 9999999)
cout << -1 << '\n';
else
cout << DP[k] << '\n';
}
int main() {
cin >> n >> k;
//memset(DP, 9999999, sizeof(DP));
//memset은 0이나 -1로 초기화할때만 쓰기
fill(DP, DP + 10001, 9999999);
for (int i = 1; i <= n; i++) {
cin >> coin[i];;
}
solution();
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 1890번: 점프 (0) | 2020.09.16 |
---|---|
(c++)백준 11058번: 크리보드 (0) | 2020.09.16 |
(c++)백준 2293번: 동전 1 (0) | 2020.09.16 |
(c++)백준 10422번: 괄호 (0) | 2020.09.16 |
(c++)백준 12869번: 뮤탈리스크 (0) | 2020.09.15 |