๊ธฐ์ ์ฝ๋ฉํ ์คํธ ์ฐ์ต์ ์ํด python์ผ๋ก ๋ฌธ์ ํ์ด ํ์์ต๋๋ค. ๐
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/2293
โซ๏ธ ๋์ ํ์ด
๋ด๊ฐ ์ฒ์์ ํ ์๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
dp[i] ์ i๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์์๋ฅผ ๋ฃ๊ณ ์ ํ๋ค. ๊ทผ๋ฐ,,, ๊ท์น๋ ๋ณด์ด์ง ์์ ๋ฟ๋๋ฌ ์ฃผ์ด์ง ์๋ก ์ด๋ป๊ฒ ๊ฒฝ์ฐ์์๋ฅผ ์ธ์ด์ผํ๋์ง ๊ฐ์ด ์์๋ค. ์๋ฅผ๋ค์ด, i = 5 ์ด๊ณ ์ฃผ์ด์ง ์๊ฐ 1, 2, 5 ๋ผ๋ฉด 5์์ 1์ ๋นผ๋ฉด์ 1์ด ๋ช๊ฐ ํ์ํ ์ง ์ธ์ด์ฃผ๊ณ , ๋๋ค์ 5์์ 2๋ฅผ ๋นผ๋ฉด์ ์กฐํฉ์ ์ฐพ์์ฃผ๊ณ .. ์ด๋ฐ๋ฐฉ์์ ์๊ฐํด๋ดค์ง๋ง, ์ด๋ ๊ฒ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ์ด์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด 'ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ์ชผ๊ฐ์ ์๊ฐํ๋' dp ์ ํ์ด ๋ฐฉ์๊ณผ๋ ๋ฉ์ด์ง๊ณ , n์ด 100๊ฐ, k๊ฐ 10000์ผ๋ก ์ฃผ์ด์ง๋ฉด, 100 * 100 * 10000 ์ฐ์ฐ์ ์ํํ๊ฒ ๋๋ค. ๋ง๋์๋๋ค ใ ใ
์ด๋ป๊ฒ dp๋ฅผ ๊ตฌ์ฑํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ, ๊ฒฐ๊ตญ ์ธํฐ๋ท์ ํํธ๋ฅผ ์กฐ๊ธ ์ป์๋ค. .. ํ... ์ค์ผ ์ด๋ ค์ด๊ฑฐ์ผ ใ
์ฐ์ ๋์ ์ฒซ๋ฒ์งธ ์ ๊ทผ๋ฐฉ์์ด ์์ ํ ํ๋ฆฌ์ง ์์๋ค. i๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ์์๋ฅผ dp์ ๋ฃ๋ ๋ฐฉ์์ ๋น์ทํ๋ฐ. ํ์ง๋ง ๊ทธ ๊ฒฝ์ฐ์์๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ด ๋ฌ๋๋ค.
์ด ์์ ์์ ์ฐ๋ฆฌ๋ ๋์ 1, 2, 5๋ฅผ ๊ฐ๊ณ ์๋ค. ์ฌ๊ธฐ์ ๋๋ dp ํ๋๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ ๋ชจ๋ ๊ฒฝ์ฐ์์๋ฅผ ํ๋ฒ์ ์ธ์ด์ฃผ๋ ค๊ณ ํ์ง๋ง, ๋ฐ๋ก ์ธ์ด์ฃผ๋ฉด ๊ท์น์ฑ์ ๋ฐ๊ฒฌํ ์ ์์๋ค.
- 1์ ์ฌ์ฉํด์ i๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ
- 2๋ฅผ ํฌํจํด์ i๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ (1๊ณผ 2)
- 5๋ฅผ ํฌํจํด์ i๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ (1 , 2, 5)
์ด๋ ๊ฒ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๋ก ์ธ์ด์ฃผ๋ฉด ๊ท์น์ฑ์ ๋ฐ๊ฒฌํ ์ ์๋ค. ์ฐ์ , ์ฐ๋ฆฌ๊ฐ ๋น์ฐํ๊ฒ ์๋ ์ฌ์ค์ 2๋ฅผ ์ด์ฉํ๊ณ ์ถ์ผ๋ฉด 2์ด์์ ์๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ๊ณผ 5๋ฅผ ์ด์ฉํ๊ณ ์ถ๋ค๋ฉด 5์ด์์ ์๋ฅผ ๋ง๋ค์ด์ผํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฐ ๊ด์ ์์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๊ฐ๋ฉฐ ๊ท์น์ ์ฐพ์๋ณด๋ฉด, ์๋์ ๊ฐ์ ์ ํ์์ด ๋์จ๋ค.
์ด๋ ๊ฒ ๊ตฌํ ์ ์๋ค. ๊ตฌํ์? ์ด์ค for๋ฌธ์ ์ด์ฉํด์ ๊ตฌํํ ์ ์๋ค.
โซ๏ธ ์ ๋ต์ฝ๋
n, k = map(int, input().split())
coin = []
for _ in range(0, n):
coin.append(int(input()))
dp = [0] * (k+1)
dp[0] = 1
for c in coin:
for i in range(c, k+1):
dp[i] = dp[i] + dp[i-c]
print(dp[k])