https://www.acmicpc.net/problem/1943
dp๋ก ํด๊ฒฐํ ์ ์๋ ๋ ์ ๋ฌธ์ ์ด๋ค.
Python3์ ์ด์ฉํด AC๋ฅผ ๋ฐ์ ์ฌ๋์ด ๋จ 4๋ช ์ผ๋ก, ๊ทธ๋ฅ Pypy๋ก ์ ์ถํ๋ ๊ฒ์ด ์ ์ ๊ฑด๊ฐ์ ์ด๋กญ๋ค.
๋ ๊ทธ๋ง์ ๋ ์๊ฐ ์ด๊ณผ, ์ค๋ต ํํฐ๋ฅผ ํ๋ค.
์ผ๋จ input์ ๋ฐ์ผ๋ฉด์ ์ ์๋ํํ ๋ฐ์ ์ ์ฒด ๊ธ์ก์ ๊ณ์ฐํ๋ค.
๋ง์ฝ ์ ์ฒด ๊ธ์ก์ด ํ์๋ผ๋ฉด ์คํ์ ์คํฌ๊ฐ ๋ชจ๋ ๋ง์กฑํ ์๋ ์์ผ๋ฏ๋ก ๊ตณ์ด ๊ณ์ฐ์ ํ ํ์ ์์ด 0์ ์ถ๋ ฅํ๊ณ ๋์ด๊ฐ๋ค.
๋ฐ๋ต์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ์ค์ ๋ก ๋ถ๋ฐฐ๊ฐ ๊ฐ๋ฅํ์ง ํ์ธํด์ฃผ์ด์ผ ํ๋ค.
์ผ๋จ dp๋ผ๋ boolean ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
dp[n]์ '์ฃผ์ด์ง ๋์ ๋ค๋ก n์๋งํผ ์ง๋ถํ ์ ์๋ค'๋ ์๋ฏธ์ด๋ค.
0์์ ์ธ์ ๊ณ ์ง๋ถํ ์ ์์ผ๋ True๋ก ์ด๊ธฐํํ๊ณ , 1์ ~ (๋ชฉํ๊ธ์ก)๊น์ง๋ ์์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ False๋ก ์ด๊ธฐํํ๋ค.
์ฌ๊ธฐ์ ๋ชฉํ๊ธ์ก์ ์ ์ฒด ๊ธ์ก์ ๋ฐ๋ต ๊ฐ์ด๋ค.
coins ๋ฆฌ์คํธ์ ๋ฃ์ด๋ ๊ฐ๊ฐ์ ๋์ ์ ์ดํด๋ณด๋ฉด์ dp ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํด์ค๋ค.
์๋ฅผ ๋ค์ด์ ์ด๋ฒ์ ํ์ธํ ๊ฐ์ด [100, 1] ์ด๋ ๊ฑด 100์์ง๋ฆฌ ๋์ ์ด ํ๋ ์๋ค๋ ์๋ฆฌ์ด๋ค.
๊ทธ๋ผ dp ๋ฐฐ์ด์์ ๋์ ๊ฐ(100)๋ถํฐ ๋ชฉํ๊ธ์ก๊น์ง์ ๋ชจ๋ index์ elements๋ฅผ ๋ค ์ดํด๋ด์ค์ผ ํ๋ค.
dp[index - 100]์ด True๋ผ๋ฉด, (index-100) ์์ ์ฃผ์ด์ง ๋์ ๋ค๋ก ๋ผ ์ ์๋ค๋ ์๋ฏธ์ธ๋ฐ, ๋ํํ 100์ ๋์ ์ด ํ๋ ๋ ์๊ฒผ์ผ๋ ๋น์ฐํ index์๋ ์ง๋ถํ ์ ์๋ค.
๋ฐ๋ผ์ dp[index]๋ฅผ True๋ก ์ ๋ฐ์ดํธํด์ฃผ๋ฉด ๋๋ค.
๋ค๋ง ์ฃผ์ํ ์ ์ด ์๋๋ฐ, ๋ฐฐ์ด์ ์์์๋ถํฐ ํ์ํ๋ฉด ์ ๋๋ค.
ํ์๊ณผ ๋์์ dp ๋ฐฐ์ด์ด ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋์ ์ ์ํด ๊ฐฑ์ ๋ ๊ฐ์ ๋ค์ชฝ ์์๊ฐ ์ด๋ฏธ ์ง๋ถ ๊ฐ๋ฅํ๋ ๊ฐ์ผ๋ก ์ฐฉ๊ฐํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชฉํ๊ธ์ก๋ถํฐ ์ง๊ธ ์ดํด๋ณด๋ ๋์ ์ ๊ธ์ก๊น์ง ๊ฑฐ๊พธ๋ก dp๋ฅผ ์ ๋ฐ์ดํธํด์ค์ผ ํ๋ค.
๋ง์ฝ ๊ฐ์ ๋์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด?
์ด๋ฒ์ ์ดํด๋ณผ ๋์ ์ด [100, 3]๋ผ๊ณ ํด๋ ๋์ ์ด ํ๋์ผ ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง๋ ์๋ค.
dp[index-100]์ด True๋ผ๋ฉด dp[index]๋ True๋ก ๊ฐฑ์ ํด์ฃผ๋ฉด ๋๋ค.
๋ค๋ง, dp[index+100], dp[index+200]๋ True์ผ ํ ๋ for๋ฌธ์ ์ด์ฉํด ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
์ด๋, dp์ ๋ฒ์๊ฐ ์ ์ฒด ๊ธ์ก์ด ์๋ ๋ฐ๋ต ๊ธ์ก๊น์ง์ด๋ฏ๋ก index range๋ ํ์ธํด์ค์ผ ํ๋ค.
dp[๋ชฉํ๊ธ์ก], ์ฆ dp[-1]์ด True๊ฐ ๋๋ ๊ฑด ๋ฐ๋ต์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค.
answer์ 1๋ก ๊ฐฑ์ ํ๊ณ break ํด์ ๋น ์ ธ๋์ค๋ฉด ๋๊ฒ ๋ค.
๋ง์ฝ ๋๊น์ง dp[-1]์ด False๋ผ๋ฉด answer์ ๊ณ์ 0์ผ ๊ฒ์ด๋ค.
์ถ๋ ฅํด์ฃผ๊ณ ๋ค์ ํ ์คํธ์ผ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉด ๋๋ค.
๋ 89~92%์์ ๊ณ~์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ด์๋ค.
์๊ฐ ์กฐ๊ธ์ด๋ผ๋ ๋ ์๊ปด๋ณธ๋ค๊ณ coins ๋ฐฐ์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ๋ฐ๋ต ๊ธ์ก๋ณด๋ค ๋์ ๊ฐ์ด ํฌ๋ฉด break ํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ณ์ ๋ง์ ธ์คฌ๋๋ฐ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ด์๋ค.
๊ทธ ์ด์ ๋ ๋์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์ ํ ๋ฒ์ ํ์ธํ ์ ์๋ ๊ฑธ ํ๋์ฉ ํ์ธํด์ค์์๋ค.
[100, 3]์ ํ์ธํด์ผ ํ ๋ [100, 1], [100, 1], [100, 1]๋ก ํ์ธํ์๋ค.
ํ์ธํด์ผ ํ ๋ฒ์๊ฐ ์ปค์ง๋ฉด ๋น์ฐํ ๋๋ฆด ์๋ฐ์.
for _ in range(3):
total = 0 # ์ ์๋ํํ
๋ฐ์ ์ ์ฒด ๊ธ์ก
coins = []
# input ๋ฐ์ผ๋ฉด์ ์ ์ฒด ์ก์ ๊ตฌํ๊ธฐ
for _ in range(int(input())):
C, N = map(int, input().split())
total += C * N
coins.append([C, N])
# ํ์๋ ๋ฐ์ผ๋ก ์๋๋ ์ง > ๊ตณ์ด ํ์ธ ์ํด๋ด๋ ๋จ
if total % 2 == 1:
print(0)
continue
total //= 2
# dp[n]์ ์๋ฏธ == ์ฃผ์ด์ง ๋์ ๋ค๋ก n์์ ๋ง๋ค ์ ์๋๊ฐ?
dp = [True] + [False] * total
answer = 0
for i in range(len(coins)):
C, N = coins[i]
# ๊ฑฐ๊พธ๋ก ํ์ํ๋ฉด์ ์ง๋ถ ๊ฐ๋ฅํ ์ก์ ๊ฐฑ์
for n in range(total, C-1, -1):
if dp[n-C]:
for j in range(N):
if n + C * j <= total:
dp[n + C * j] = True
else:
break
if dp[-1]: # ๋ฐ๋ต ๊ฐ๋ฅ!
answer = 1
break
print(answer)
'๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1406 ์๋ํฐ - ํ์ด์ฌ (0) | 2022.11.27 |
---|---|
๋ฐฑ์ค 2941 ํฌ๋ก์ํฐ์ ์ํ๋ฒณ - ํ์ด์ฌ, ์๋ฐ (0) | 2022.11.26 |
๋ฐฑ์ค 1107 ๋ฆฌ๋ชจ์ปจ - ํ์ด์ฌ (0) | 2022.11.20 |
๋ฐฑ์ค 9012 ๊ดํธ - ํ์ด์ฌ (0) | 2022.11.20 |
๋ฐฑ์ค 11286 ์ ๋๊ฐ ํ - ํ์ด์ฌ (0) | 2022.11.19 |