https://www.acmicpc.net/problem/2293
2293๋ฒ: ๋์ 1
์ฒซ์งธ ์ค์ n, k๊ฐ ์ฃผ์ด์ง๋ค. (1 โค n โค 100, 1 โค k โค 10,000) ๋ค์ n๊ฐ์ ์ค์๋ ๊ฐ๊ฐ์ ๋์ ์ ๊ฐ์น๊ฐ ์ฃผ์ด์ง๋ค. ๋์ ์ ๊ฐ์น๋ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
www.acmicpc.net
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 |