Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
Tags
- 5582 DP
- 자바
- 백준 5582
- 이진 탐색
- 안드로이드 hilt
- Android Room
- Android mvp
- 백준 1644
- 1806 파이썬
- 자료구조
- 10819 파이썬
- 5582 파이썬
- 2096 파이썬
- 1644 파이썬
- 1806 백준
- android hilt
- git local remote
- 투포인터 알고리즘
- Jetpack Room
- 6588 파이썬
- Coroutine Flow
- 코루틴 플로우
- 1806 투포인터
- 백준 2096
- 1753 파이썬
- flow buffering
- 1753 다익스트라
- 1003 파이썬
- java
- 백준 10819
Archives
- Today
- Total
Gemstone's Devlog
[이것이 코딩테스트다] 효율적인 화폐 구성 본문
문제
N가지 종류의 화폐가 있다. 이 화폐들의 개수를 최소한으로 이용해서 그 가치의 합이 M원이 되도록 하려고 한다. 이떄 각 화폐는 몇 개라도 사용할 수 있으며, 사용한 화폐의 구성은 같지만 순서만 다른 것은 같은 경우로 구분한다. 예를 들어 2원, 3원 단위의 화폐가 있을 때는 15원을 만들기 위해 3원을 5개 사용하는 것이 가장 최소한의 화폐 개수이다.
입력 조건
- 첫째 줄에 N, M이 주어진다. ( 1<=N<=100, 1<=M<=10,000)
- 이후 N개의 줄에는 각 화폐의 가치가 주어진다. 화폐 가치는 10,000보다 작거나 같은 자연수이다.
출력 조건
- 첫째 줄에 M원을 만들기 위한 최소한의 화폐 개수를 출력한다.
- 불가능할 때는 -1을 출력한다.
입력 예시 1
2 15
2
3
출력 예시 1
5
입력 예시 2
3 4
3
5
7
출력 예시 2
-1
소스 코드
# 정수 N, M을 입력받기
n, m = map(int, input().split())
# N개의 화폐 단위 정보를 입력받기
array = []
for i in range(n):
array.append(int(input()))
# 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [10001] * (m+1)
# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
for j in range(array[i], m+1):
if d[j - array[i]] != 10001: # (i - k)원을 만드는 방법이 존재하는 경우
d[j] = min(d[j], d[j-array[i]] + 1)
# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
print(-1)
else:
print(d[m])
'Data Structure & Algorithms' 카테고리의 다른 글
[Codeforces] 1285B: Just Eat It! (0) | 2022.03.10 |
---|---|
[백준] 1932번: 정수 삼각형 (다이나믹 프로그래밍) (0) | 2022.03.02 |
[백준] 1463번: 1로 만들기 (다이나믹 프로그래밍) (0) | 2022.02.27 |
[이것이 코딩테스트다] 떡볶이 떡 만들기 (0) | 2022.02.26 |
[알고리즘] 이진 탐색 정리 (0) | 2022.02.26 |