๋ฌธ์
์คํ์ ์คํฌ๋ ์์ ์๋ฒํ์ฌ ์ฐ๋ ๊ธฐ๋ฅผ ์ค๋ ์ฐฉํ ์ผ์ ํ์๋ค. ์์ฅ์ ์๋๊ป์๋ ์คํ์ ์คํฌ๋ฅผ ์นญ์ฐฌํ์๊ณ ๊ณผ์๋ ์ฌ ๋จน์ผ๋ผ๊ณ ํ์๋ฉฐ ๋์ ๋ช ๊ฐ๋ฅผ ์คํ์ ์คํฌ์๊ฒ ๊ฑด๋ค ์ฃผ์๋ค.
๊ทธ๋ฐ๋ฐ ๋์ ๋ฐ์ ์คํ์ ์คํฌ๋ ์ข์ํ๊ธฐ๋ณด๋ค ๊ณ ๋ฏผ์ ๋น ์ง๊ณ ๋ง์๋ค. ์์ฅ์ ์๋๊ป ๋ฐ์ ์ด ๋์ ์ด๋ป๊ฒ ๋๋์ด ํ ์ง ๊ณ ๋ฏผ์ ๋น ์ง ๊ฒ์ด๋ค. ๋ ์ฌ๋ ๋ชจ๋ ์๋๋ฐฉ์ด ์๊ธฐ๋ณด๋ค 1์์ด๋ผ๋ ๋ ๋ฐ๋ ๊ฒ์ ๋์ ํ ์ธ์ ํ ์ ์์ด ํ๋ค. ๋ฐ๋ผ์ ๋์ ๋๊ฐ์ด ๋๋ก ๋๋์ด ๊ฐ์ ธ์ผ ๋ ์ฌ๋์ด ๋ชจ๋ ๋ง์กฑํ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ๋ ์ฌ๋์๊ฒ ๋์ ๋๊ฐ์ด ๋๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ์๋ค. ์๋ฅผ ๋ค์ด 500์์ง๋ฆฌ 1๊ฐ์ 50์์ง๋ฆฌ 1๊ฐ๋ฅผ ๋ฐ์๋ค๋ฉด, ์ด ๋์ ๋ ์ฌ๋์ด ๋๊ฐ์ด ๋๋์ด ๊ฐ์ง ์๋ ์๋ค. ๋ฌผ๋ก ๋์ ์ ๋ฐ์ผ๋ก ์๋ผ์ ๋๋์ด ๊ฐ์ง ์๋ ์๊ฒ ์ง๋ง ๊ทธ๋ฌ๋ฉด ๋์ผ๋ก์์ ๊ฐ์น๋ฅผ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ ์๋ ์๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค. ์์ฅ ์ ์๋๊ป์ N๊ฐ์ง ์ข ๋ฅ์ ๋์ ์ ๊ฐ๊ฐ ๋ช ๊ฐ์ฉ ์ฃผ์ จ์ ๋, ๊ทธ ๋์ ๋ฐ์ผ๋ก ๋๋ ์ ์๋์ง ์๋์ง ํ๋จํ๋ ๊ฒ์ด๋ค.
์ ๋ ฅ
์ธ ๊ฐ์ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ๋์ ์ ์ข ๋ฅ N(1 ≤ N ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ฐ ์ ๋ ฅ์ ๋์งธ ์ค๋ถํฐ N+1์งธ ์ค๊น์ง ๊ฐ๊ฐ์ ๋์ ์ ๊ธ์ก๊ณผ ๊ฐ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋จ, ์์ฅ์ ์๋๊ป์ ์ฃผ์ ๊ธ์ก์ ์ด ํฉ์ 100,000์์ ๋์ง ์๋๋ค. ๋์ ์ ๊ธ์ก๊ณผ ๊ฐ์๋ ์์ฐ์์ด๊ณ , ๊ฐ์ ๊ธ์ก์ ๊ฐ์ง ๋์ ์ด ๋ ๋ฒ ์ด์ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ ์ธ ์ค์ ๊ฑธ์ณ, ๊ฐ ์ ๋ ฅ์ ๋ํ์ฌ ๋ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉด 1, ๋ถ๊ฐ๋ฅํ๋ฉด 0์ ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
import sys
for _ in range(3):
n=int(sys.stdin.readline())
coins=[]
amount=0
for _ in range(n):
coin, num=map(int, sys.stdin.readline().strip().split(' '))
coins.append([coin, num])
amount+=coin*num
# ์ด์ก์ด ํ์์ด๋ฉด ๋๊ฐ์ด ๋ถ๋ฐฐํ ์ ์์ผ๋ฏ๋ก 0 ์ถ๋ ฅํ๊ณ ์ข
๋ฃ
if amount%2==1:
print(0)
continue
goal=amount//2
dp=[1]+[0]*(goal)
for coin, num in coins:
for n in range(goal,coin-1, -1):
if dp[n-coin]==1:
for i in range(num):
if n+coin*i<=goal:
dp[n+coin*i]=1
else:
break
if dp[-1]==1:
print(1)
else:
print(0)
- ๋
์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค.
- ์ดํด๋๋ค ์ถ๋ค๊ฐ๋ ๋ค์ ๋ณด๋ฉด ๋ ์ ์ดํด๊ฐ ์๋๋ค.. ์๋ฒฝํ๊ฒ ์ดํดํ ๊ฒ ์๋ ๊ฑฐ ๊ฐ๋ค. ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋๋ก ํ๊ณ ๋ค์ด์ ๋ ์๋ง ๋ฐ๋ก ํฌ์คํ ํด์ผ๊ฒ ๋ค!
- ๋์ ๊ณผ ๋์ ๊ฐ์๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด์ ์ด์ก์ ๊ณ์ฐํด์ฃผ๋๋ฐ ์ด๋ ์ด์ก์ด ํ์๋ผ๋ฉด ๋๋ก ๋๊ฐ์ด ๋๋ ์ง์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ 0์ ์ถ๋ ฅํ๊ณ ๋์ด๊ฐ๋ฉด ๋๋ค.
- ์ด์ก์ด ์ง์๋ผ๋ฉด DP๋ฅผ ์ด์ฉํด์ DP[์ด์ก//2] ๊ฐ์ด 1์ธ์ง, ์ฆ ๊ฐ์ง๊ณ ์๋ ๋์ ๋ค๋ก ์ด์ก//2 ๊ฐ์ ๋ง๋ค ์ ์๋์ง ํ์ธํ๋ค.
- ์ฌ๊ธฐ์ dp[n]์ ์๋ฏธ๋ ๊ฐ์ง๊ณ ์๋ ๋์ ๋ค๋ก n์์ ๋ํ๋ผ ์ ์๋์ง(1), ์๋์ง(0)๋ฅผ ์๋ฏธํ๋ค.
- ๋จผ์ DP ๋ฐฐ์ด์ ์ ์ธํ ๋ DP[0]์ 1๋ก ์ด๊ธฐํํด์ค๋ค. (์๋ฌด๊ฒ๋ ์ ๋ด๋ ์ง๋ถ ๊ฐ๋ฅํ๋๊น) ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ๊ฐ๋ค์ 0์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
- ์ ๋ ฅ๋ฐ์ ๋์ (coin)๊ณผ ๊ฐ ๋์ ์ ๊ฐ์(num)๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ฉด์ DP ๊ฐ์ ์ฑ์์ค๋ค.
- ๋ณ์ goal์ ์ ์ฅ๋ ์ด์ก//2 ๊ฐ๋ถํฐ, ํ์ฌ ํ์ ์ค์ธ coin๊น์ง for๋ฌธ์ผ๋ก ํ์ํ๋ฉด์ dp[n-coin]์ด ๋ง๋ค ์ ์๋ ๊ฐ์ธ์ง(1) ํ์ธํ๋ค.
- ์ฆ, 'n-coin'์ด ๋ง๋ค ์ ์๋ ๊ฐ์ด๋ผ๋ฉด(dp[n-coin]) ์ฐ๋ฆฌ๋ ํ์ฌ coin์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ n ๋ํ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ์ ์๋ ์๊ฐ ๋๋ค.
- ์ด์ coin์ ๊ฐ์(num)-1๋งํผ for๋ฌธ์ ๋๋ฉด์ ๋ง๋ค ์ ์๋ ๊ฐ์ dp์ ๊ฐฑ์ ํด์ค๋ค.
- coin 1๊ฐ๋ฅผ ์ด์ฉํ๋ฉด n์ ๋ง๋ค ์ ์๋ ์๊ฐ ๋๊ธฐ ๋๋ฌธ์ coin์ ๊ฐ์๊ฐ ๋จ๋ ํ n+coin*1, n+coin*2,..,n+coin*(num-1)๋ goal์ ์ด๊ณผํ์ง ์์ผ๋ฉด ๋ง๋ค ์ ์๋ ์๊ฐ ๋๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํด์ ๋ชจ๋ ๋์ ์ ํ์ํ๊ณ ๋์, dp์ ๋ง์ง๋ง ๊ฐ ์ฆ, dp[์ด์ก//2] ๊ฐ์ด 1์ด๋ผ๋ฉด ๋ฐ์ผ๋ก ๋๋ ์ ์๋ค๋ ๋ป์ด๋ฏ๋ก 1์ ์ถ๋ ฅํ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด 0์ ์ถ๋ ฅํ๋ค.
'์๊ณ ๋ฆฌ์ฆ > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 3687 ๐ฅ] ์ฑ๋ฅ๊ฐ๋น (0) | 2023.08.18 |
---|---|
[๋ฐฑ์ค 15989 ๐ฅ] 1, 2, 3 ๋ํ๊ธฐ 4 (0) | 2023.08.18 |
[๋ฐฑ์ค 2631 ๐ฅ] ์ค์ธ์ฐ๊ธฐ (0) | 2023.08.12 |
[๋ฐฑ์ค 11053 ๐ฅ] ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (0) | 2023.08.12 |
[๋ฐฑ์ค 17404 ๐ฅ] RGB ๊ฑฐ๋ฆฌ2 (0) | 2023.07.27 |