2022. 1. 9. 22:51ใ๐ฑ Algorithm/DP
https://www.acmicpc.net/problem/2293
๋ฌธ์ ์์ฝ
์ฃผ์ด์ง N๊ฐ ์ซ์๋ก ์ด๋ค์ง ๋ฐฐ์ด์ ๊ฐ์ ๋ํ์ฌ, K ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ผ (๋ฐฐ์ด์ ์ซ์๋ ์ค๋ณตํ์ฌ ๋ํด๋ ๋๋ค)
์ ๋ต ์ฝ๋
N, K = map(int, input().split())
arr = []
for _ in range(N):
arr.append(int(input()))
dp = [0] * (K + 1)
dp[0] = 1
for a in arr:
for j in range(a, K + 1):
dp[j] += dp[j - a]
print(dp[K])
์ ๊ทผ๋ฐฉ๋ฒ
์๊ฐ์ ํ, ๋ฉ๋ชจ๋ฆฌ์ ํ์ด ๋ค๋ฅธ ๋ฌธ์ ๋ณด๋ค ๋์๋๊ฒ ์๋ค. ์ฆ ๋ฌด์์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ brute force ๋ greedy ๋ก๋ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
๋ฐฐ์ด์ ์๋ฅผ ๋ํ์ฌ K ๊ฐ ๋๋ ์กฐํฉ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ๋์ฌ ์ ์๋ค. ์๋ฅผ ๋ค์ด 10์ ์ด๋ฃจ๋ ์กฐํฉ ์ค (5, 5)๊ฐ ์๋ค๋ฉด, ์ฃผ์ด์ง ์๋ฅผ ์ด์ฉํ์ฌ 5 ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์ฌ๋ฌ๊ฐ์ง ์กด์ฌํ๋ค. ์ฆ ๋ถ๋ถ ํฉ์ ์ด์ฉํ์ฌ ์ ๋ต์ ๊ฐ๊น์ ์ง๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ ์ ์๋ค.
10์ ์ด๋ฃจ๋ ์ฌ๋ฌ ์กฐํฉ์ ๊ตฌํ๊ธฐ ์ํด์ , ๊ทธ ์ ๋จ๊ณ์ธ 9, 8, 7, ... , 2, 1 ์ ๋ง๋ค ์ ์๋ ์กฐํฉ์ ์๋ฅผ ๊ตฌํด๋ณด์. ๊ทธ๋ฆฌํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ ํ๋ 10 (=K) ๋ฅผ ๊ตฌํ๋๋ฐ ๋ ์์ํ๊ฒ ์ ๊ทผํ ์ ์๋ค.
์ฌ๊ธฐ์ a ๋ ์ฃผ์ด์ง N๊ฐ์ ์ซ์๋ฅผ ์๋ฏธํ๋ค.
a ๊ฐ 1๋ง ์์ ๋๋, ๊ฐ๊ฐ์ ์ซ์๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ ๋น์ฐํ ํ๋๋ค. (๋ชจ๋ ์๋ฅผ 1์ ๋ํ์ฌ ๋ง๋๋ ๋ฐฉ๋ฒ)
์ด๋์ ๊ฐ์ dp ๋ผ๋ ๋ฐฐ์ด์ ์ ์ฅ ํด๋๊ณ , a ๊ฐ 2์ธ ๊ฒฝ์ฐ๋ฅผ ๋ณด์.
a ๊ฐ 2์ผ ๋ 2๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ dp[2]์ ์ ์ฅํ ์ ์๊ณ , ๊ฐ์ด 2๋ก ์ ๋ฐ์ดํธ(1 -> 2)๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ๊ฐ ๋ฐฐ์ด์ ๊ฐ๋ค์ ์ ๋ฐ์ดํธํด๋๊ฐ๋ฉด, ์ฃผ์ด์ง N ๊ฐ ์ซ์๋ก ์กฐํฉํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์๋ฐ.
์ถ๊ฐ )
dp[j - a] ์์ ๋ณด๋ฉด, a ๋ N ๊ฐ์ ์ซ์์ค ํ๋์ด๊ณ , j ๋ a ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์ซ์์ค ํ๋์ด๋ค.( K ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ธฐ๋ ํจ).
์ฆ j - a ๋ 0 ์์๋ถํฐ K - a ๊น์ง์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ ์ซ์๊ฐ ๋๋ค.
'๐ฑ Algorithm > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 11055 ํ์ด์ฌ (0) | 2022.01.23 |
---|---|
๋ฐฑ์ค 1912 ํ์ด์ฌ (0) | 2022.01.20 |
๋ฐฑ์ค 11053 ํ์ด์ฌ (0) | 2022.01.18 |
๋ฐฑ์ค 12852 ํ์ด์ฌ (1) | 2022.01.12 |
๋ฐฑ์ค 1699 ํ์ด์ฌ (0) | 2022.01.07 |