https://www.acmicpc.net/problem/2293
DP λ무 μ΄λ ΅λ€μμ
μμ΄λμ΄
1. DP
- λ¬Έμ λ₯Ό λ³΄κ³ dpλ¬Έμ μΈ κ²λ μκ³ 'DP [k] = ν©μ΄ kκ° λλ κ²½μ°μ μ'λΌλ κ²λ μμλ€.
- κ·Όλ° μ νμ μμ΄λμ΄κ° λ μ€λ₯΄μ§ μμ κ²μμ νμ λΉλ Έλ€.
- μΌμ£ΌμΌ λ€μ λ νμ΄λ΄€λλ° λ κΉλ¨Ήμλ€. μ΄ν΄λ₯Ό λͺ» νλ€λ λ»μ΄λ€.
- μ΄λ² κΈ°νμ μ λλ‘ μ΄ν΄νκ³ λμ΄κ°κΈ°λ‘ ν¨.
μ½λ μ€λͺ
DP = [0] * (k + 1)
DP[0] = 1
for c in coins:
for i in range(c, k + 1):
DP[i] += DP[i - c]
μΌλ¨ μ½λλ μ λ§ κ°λ¨νλ€. νλνλ λ―μ΄λ³΄λλ‘ νμ.
λ¨Όμ λ¬Έμ μμ "μ¬μ©ν λμ μ ꡬμ±μ΄ κ°μλ°, μμλ§ λ€λ₯Έ κ²μ κ°μ κ²½μ°μ΄λ€."λΌλ λ§μ
μλ₯Ό λ€μ΄ ν©μ΄ 4κ° λλ κ²½μ°μμ '1 1 2'μ '2 1 1', '1 2 1'μ κ°μ κ²½μ°λ‘ μ·¨κΈνλ€λ λ»μ΄λ€.
μ΄κ±Έ κ³ λ € μ νλ©΄ μ΄λ€ κ²½μ°κ° μκΈ°λμ§ λ€μ μμλ₯Ό 보면 λλ€. μλ©΄ κ·Έλ₯ λμ΄κ°λ λ¨.
μ μλ₯Ό λ€μ΄μ λμ μ’ λ₯κ° '1, 2'κ° μκ³ k = 4, ν©μ΄ 4κ° λλ κ²½μ°μ μλ₯Ό ꡬνλ€κ³ μκ°ν΄λ³΄μ.
κ·ΈλΌ μΌλ¨ κ²°κ³Όλ₯Ό λ¨Όμ μκ°ν΄λ³΄λ©΄ dp [4]μ 3μ΄ μ μ₯λμΌνλ€.
μ§μ κ²½μ°λ₯Ό μ μ΄λ³΄λ©΄ '1 1 1 1', '1 1 2', '2 2'λ‘ 3κ°μ§κ° λμμΌ ν¨.
κ·ΈλΌ λ΄κ° μ§κΈ 1μμ΄ μλ€κ³ μκ°νμ. μ¬κΈ°μ λλ 3μμ μΆκ°ν΄ μ£Όλ©΄ 4μμ΄ λλ€.μ΄ λ§μ 3μμ λ§λλ κ²½μ°μμ 1μλ§ μΆκ°ν΄μ£Όλ©΄ 4μμ΄ λλ€λ μ리λ€.μ΄ κ·ΈλΌ 3μμ λ§λλ κ²½μ°λ λκ° μμ§λΌκ³ μκ°ν΄λ³΄λ©΄ '1 1 1', '1 2'κ° μλ€. μ¬κΈ°μ 1μμ λνλ©΄ '1 1 1 1', '1 2 1' λ κ°μ§ κ²½μ°κ° λμ¨λ€.μ΄λ κ² λλ©΄ μμμ λ§ν κ°μ κ²½μ°λ‘ μ·¨κΈ λ¬Έμ κ° μκΈ΄λ€.
μ΄κ² λ¬΄μ¨ μ리λ. μ΄λ²μλ 2μμ΄ μλ€κ³ μκ°νμ. μ¬κΈ°μ 2μμ μΆκ°ν΄μ£Όλ©΄ 4μμ΄ λλ€.2μμ λ§λλ κ²½μ°λ '1 1', '2' λ κ°μ§κ° μλ€.μ¬κΈ°μ 2μμ λνλ©΄'1 1 2', '2 2' λ κ°μ§κ° λλ€.
μ λ΅μ 3μΈλ° μμ κ°μ λ°©μμΌλ‘ νλ κ²½μ°μ μκ° 4κ° λλ€.
'1 1 2'μ '1 2 1'μ λ€λ₯Έ κ²½μ°λ‘ μ·¨κΈν΄μ μκΈ΄ λ¬Έμ λ€.
κ·ΈλΌ μ΄λ»κ² ν΄μΌ νλ. λμ μ νλμ© λ£λλ€κ³ μκ°νλ©΄ λλ€.
λμ μ μ¬μ©νλ κ°μ§ μλ₯Ό λλ €κ°λ©° dpκ°μ μ λ°μ΄νΈνλ€λ λ»μ΄λ€.
νλ‘ λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
DP | 0 | 1 | 2 | 3 | 4 |
c = 1μΌλ | 1 | 1 | 1 (1 1) | 1 (1 1 1) | 1 (1 1 1 1) |
c = 2μΌλ | 1 | 1 | 2 (1 1, 2) | 2 (1 1 1, 1 2) | 3 (1 1 1 1, 1 1 2, 2 2) |
μ΄λ κ² νλ©΄ '1 2'μ 1μμ μΆκ°ν΄μ 4λ₯Ό λ§λλ κ²½μ°λ μλμΌλ‘ μ μΈλλ€.
μλ μ΄λ―Έ '1 2'λΌλ κ²μ 1μμ μ°κ³ 2μμ μΌλ€λ 건λ°, μ¬κΈ°μ λ€μ 1μμ μΈ μ μλ€!
μ€μ forλ¬ΈμΌλ‘ μκ°ν΄λ³΄λ©΄ c = 1μΌ λκ° μ§λκ°κ³ c = 2μΌ λ λ€μ c = 1μΌ λλ‘ λμκ° μ μλ€λ λ§μ΄λ€.
λ΄κ° μ΄ μκΈ°λ₯Ό κΈΈκ² ν μ΄μ λ μΈν°λ·μμ μ½λλ₯Ό μ°Ύμλ³Ό λ 'μ΄μ€ forλ¬Έμ μ°λ κ²μ μκ² λλ° μ coin리μ€νΈ forλ¬Έμ΄ λ¨Όμ μ§?'μ λν μλ¬Έμ ν΄κ²°μ μν¨μ΄μλ€.
λ°λΌμ
DP [4] (1,2 μμΌλ‘ 4λ₯Ό λ§λλ κ²½μ°μ μ) = DP[4] (μλ 1μμΌλ‘λ§ 4λ₯Ό λ§λλ κ²½μ°μ μ) + DP[4 - 2] (1, 2 μμΌλ‘ 2λ₯Ό λ§λλ κ²½μ°μ μ, μ¬κΈ°μ 2μλ§ μΆκ°ν΄μ£Όλ©΄ 4κ° λλκΉ.)
-> DP[i] += DP[i - c] λ‘ ννν μ μλ€.
μ¬κΈ°μ i - cκ° μμκ° λλ©΄ μ λλκΉ iλ cλΆν° μμνκ² μμ±ν΄μΌ νλ€.
2μμΌλ‘ 1μμ λͺ»λ§λλ κ²κ³Ό κ°μ λ§μ΄λ€.
μ΄λ κ² μ½λλ₯Ό μμ±νλ©΄ DP [0]μ κ°μ΄ νμνλ€.
DP [0]μ΄λΌλ κ²μ DP [k - k]λΌκ³ μκ°νλ©΄ μ½λ€.
λ΄κ° ν©μ΄ kκ° λκ² λ§λ€ λ, kμμ§λ¦¬ λμ νλλ§ μ°λ κ²½μ°λ€.
κ·Έλμ μ΄κΈ°μ DP[0] = 1μ μ μ₯νλ€.
μ΄μ°¨μ λ°°μ΄μ μ°λ©΄ μ’ λ μ§κ΄μ μΌλ‘ μμλ³Ό μ μμ§λ§, λ©λͺ¨λ¦¬ μ νμ΄ μμ΄μ κ°λ€μ μ λ°μ΄νΈν΄μ£Όλ λ°©μμ νν΄μΌ νλ€.
μ 체 μ½λ
n, k = map(int, input().split())
coins = []
for i in range(n):
coins.append(int(input()))
coins.sort()
DP = [0] * (k + 1)
DP[0] = 1
for c in coins:
for i in range(c, k + 1):
DP[i] += DP[i - c]
print(DP[k])
'𧩠Problem Solving > [λ°±μ€]' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] 16236 μκΈ° μμ΄ (python νμ΄μ¬) (0) | 2022.07.05 |
---|---|
[λ°±μ€] 17626 Four Squares (python νμ΄μ¬) (0) | 2022.07.05 |
[λ°±μ€] 2096 λ΄λ €κ°κΈ° (python νμ΄μ¬) (0) | 2022.07.04 |
[λ°±μ€] 16928 λ±κ³Ό μ¬λ€λ¦¬ κ²μ (python νμ΄μ¬) (0) | 2022.07.03 |
[λ°±μ€] 5525 IOIOI (python νμ΄μ¬) (0) | 2022.07.03 |