π©π»βπ»λ¬Έμ μ€λͺ
[μ΄μ½ν
Ch8-5] ν¨μ¨μ μΈ νν κ΅¬μ± (DP)
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
βοΈIdea Sketch
μκ³ λ¦¬μ¦ : λ€μ΄λλ―Ή νλ‘κ·Έλλ°, Bottom-Up
μκ°λ³΅μ‘λ
O(NM) : μ΄μ€λ°λ³΅λ¬Έ
μ΄ λ¬Έμ λ μμ λ¬Έμ λΆν° μ°¨κ·Όμ°¨κ·Ό λ΅μ λμΆνλ Bottom-Up λ°©μμΌλ‘ ꡬννλ€. κ°μΉ 1μλΆν°(μμ κ°μΉλΆν°) κ°μΉ MμκΉμ§ νμνλ©°, ν λ² νμν λλ§λ€ λͺ¨λ ννλ₯Ό νμΈνλ€. νν μ’ λ₯λ Nκ°μ΄λ―λ‘ μκ°λ³΅μ‘λλ O(M*N)μ΄ λλ€.
βοΈλ΄ μμ€μ½λ
- dp λ°°μ΄μ indexλ κ°μΉ, valueλ νν κ°μμ΄λ€. μ²μμλ valueλ₯Ό 무νλ κ°μΌλ‘ μ΄κΈ°ννλ€. λ¨ κ°μΉ 0μμ λ§λ€κΈ° μν΄ νμν νν κ°μλ 0κ°μ΄λ―λ‘ dp[0] = 0μ΄λ€.
- κ°μΉ 1μλΆν° κ°μΉ MμκΉμ§ νμνλ©°, ν λ² νμν λλ§λ€ λͺ¨λ ννλ₯Ό νμνλ€. (μ΄μ€λ°λ³΅λ¬Έ)
- κ°μΉ mμμ λ§λ€κΈ° μν΄ νμν νν κ°μκ° λ¬΄νλμΈ κ²½μ° λΆκ°λ₯νλ€λ λ»μ΄λ―λ‘ -1μ μΆλ ₯νλ€.
import sys
si = sys.stdin.readline
n, m = map(int, si().split())
coins = [int(si()) for _ in range(n)]
dp = [float('inf')] * (m + 1)
dp[0] = 0
for i in range(1, m + 1):
for coin in coins:
if i >= coin:
dp[i] = min(dp[i], dp[i - coin] + 1)
if dp[m] == float('inf'):
print(-1)
else:
print(dp[m])