π λ¬Έμ
nκ°μ§ μ’ λ₯μ λμ μ΄ μλ€. κ°κ°μ λμ μ΄ λνλ΄λ κ°μΉλ λ€λ₯΄λ€. μ΄ λμ μ μ λΉν μ¬μ©ν΄μ, κ·Έ κ°μΉμ ν©μ΄ kμμ΄ λλλ‘ νκ³ μΆλ€. κ·Έ κ²½μ°μ μλ₯Ό ꡬνμμ€. κ°κ°μ λμ μ λͺ κ°λΌλ μ¬μ©ν μ μλ€.
μ¬μ©ν λμ μ ꡬμ±μ΄ κ°μλ°, μμλ§ λ€λ₯Έ κ²μ κ°μ κ²½μ°μ΄λ€.
μ λ ₯
첫째 μ€μ n, kκ° μ£Όμ΄μ§λ€. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) λ€μ nκ°μ μ€μλ κ°κ°μ λμ μ κ°μΉκ° μ£Όμ΄μ§λ€. λμ μ κ°μΉλ 100,000λ³΄λ€ μκ±°λ κ°μ μμ°μμ΄λ€.
μΆλ ₯
첫째 μ€μ κ²½μ°μ μλ₯Ό μΆλ ₯νλ€. κ²½μ°μ μλ 2³¹λ³΄λ€ μλ€.
β νμ΄κ³Όμ
μ²μμ λ μ¬λ¦° μκ°μ μλ₯μμ νμλ κ²μ²λΌ κ°μ₯ ν° μλ€μ λ¨Όμ λ£κ³ κ²½μ°μ μλ₯Ό μ°ΎμλΌκ³ νμλ€.
κ·Έλμ μ¬κ·λ₯Ό μ°κ±°λ top-down λ°©μμ μ¬μ©ν΄μ κ°μ μ μ₯ν΄λλΌκ³ νλλ°
μ λͺ¨λ₯΄κ² μ΄μ λμμμ μ°Έκ³ ν΄μ λ¬Έμ λ₯Ό νμλ€.
| dp[1] | dp[2] | dp[3] | dp[4] | dp[5] | dp[6] | dp[7] | dp[8] | dp[9] | dp[10] | |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 0 | 1 | 2 (1+2) |
2 (2+2, 1+1+2) |
2 (2+2+1, 1+1+1+2) |
|||||
| 5 |
ν - kμ
μ΄ - λμ μ κ°μΉ
μ¦ dp(1, k)μ 1μμ μ¬μ©νμ¬ kμμ λ§λλ λ°©λ²μ΄λΌκ³ ν μ μλ€.
dp(2,k)μμλ 1,2μμ μ¬μ©νμ¬ kμμ λ§λλλ° "2μμ μΆκ°ν λ"μ "2μμ μΆκ°νμ§ μμ λ"λ‘ λλ μ μλ€.
2μμ μΆκ°νμ§ μμ λλ dp[k]
2μμ μΆκ°ν λλ dp[k-2]
=> dp[k] = dp[k] + dp[k-2]
n, k=map(int, input().split())
v=[]
for _ in range(n):
v.append(int(input()))
dp=[0]*(k+1)
dp[0]=1
for i in v:
for j in range(i, k+1):
dp[j] += dp[j-i]
print(dp[k])