We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1495๋ฒˆ: ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ - ํŒŒ์ด์ฌ

Redddy 2022. 5. 2. 14:45

๐Ÿ“• ๋ฌธ์ œํ•ด์„

๊ธฐํƒ€ ์—ฐ์ฃผ๋ฅผ ํ•˜๋Š”๋ฐ ๊ฐ ๊ณก๋งˆ๋‹ค ๋ณผ๋ฅจ์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ณก๋งˆ๋‹ค ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋‹ค. ๊ทธ ์ˆซ์ž๋กœ ํ˜„์žฌ ๋ณผ๋ฅจ์—์„œ ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ณผ๋ฅจ์ด ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋ฉด ์•ˆ๋˜๊ณ  ์ฃผ์–ด์ง„ ๋ณผ๋ฅจ ๊ฐ’์„ ๋„˜์„ ์ˆ˜๋„ ์—†๋‹ค. 
์ด๋•Œ ์ตœ๋Œ€ ๋ณผ๋ฅจ์€?

 

๐Ÿ“– ๋ฌธ์ œํ’€์ด

1. n, s, m๊ณผ v๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  m ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๋ฆฌ์ŠคํŠธ n+1๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค. (๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ)
2. ํ˜„์žฌ ๋ณผ๋ฅจ์„ ์ฒดํฌํ•œ๋‹ค.
3. ์‹œ์ž‘ ๋ณผ๋ฅจ์—์„œ ์ฃผ์–ด์ง„ v[i]๋ฅผ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋”ํ•˜๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋นผ์ค€๋‹ค. 0<=s+v[i]<= m or 0<=s-v[i]<=m
4. 3๋ฒˆ์—์„œ ๋งŒ๋“ค์–ด์ง„ ๋ณผ๋ฅจ์—์„œ v[i]๋ฅผ ๋นผ๊ฑฐ๋‚˜ ๋”ํ• ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด์ค€๋‹ค.
5. ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฆฌ์ŠคํŠธ(์™„๊ณกํ›„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ๋“ค์ด ๋‹ด๊ธด)๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ›„ ๊ทธ ์ตœ๋Œ€๋ณผ๋ฅจ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ 1
3 5 10
5 3 7

dp =[[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]

 

๋ฆฌ์ŠคํŠธ ๋„˜์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค ๊ฐ€๋Šฅํ•œ ๋ณผ๋ฅจ์—์„œ v[i] ๋นผ๊ฑฐ๋‚˜ ๋”ํ•ด๋ณด๊ณ  ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด๋ผ๋ฉด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

# n์€ ๊ณก์˜ ๊ฐœ์ˆ˜, s๋Š” ์‹œ์ž‘ ๋ณผ๋ฅจ, m์€ ์ตœ๋Œ€ ๋ณผ๋ฅจ
n, s, m = map(int, input().split())
# ๋ณผ๋ฅจ ๋ฆฌ์ŠคํŠธ ์ž…๋ ฅ๋ฐ›์Œ
v = list(map(int, input().split()))

# dp ์ •์˜
dp = [[0] * (m+1) for i in range(n+1)]

# ์ฒ˜์Œ ์‹œ์ž‘
# print(dp[0][s])
dp[0][s] = 1

for i in range(1, n+1): # ๊ณก์˜ ๊ฐœ์ˆ˜๋งŒํผ
    for j in range(m+1): # ์ตœ๋Œ€ ๋ณผ๋ฅจ๊นŒ์ง€ ๋Œ๋ฉด์„œ ํ˜„์žฌ ๋ณผ๋ฅจ์„ ์ฐพ์Œ
        if dp[i-1][j] != 0: # ๋ณผ๋ฅจ ์กฐ์ ˆ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ฆ‰ ํ˜„์žฌ ๋ณผ๋ฅจ ์ฐพ๊ธฐ
            if 0<=j+v[i-1]<=m: # ํ˜„์žฌ ๋ณผ๋ฅจ๊ณผ ๋”ํ•œ ๋ณผ๋ฅจ์ด 0 <= v <= m ์ด๋ผ๋ฉด ๋”ํ•ด์คŒ
                dp[i][j+v[i-1]]=1
            if 0<=j-v[i-1]<=m: # ํ˜„์žฌ ๋ณผ๋ฅจ๊ณผ ๋บ€ ๋ณผ๋ฅจ์ด 0 <= v <= m ์ด๋ผ๋ฉด ๋นผ์คŒ
                dp[i][j-v[i-1]]=1

# ๋ณผ๋ฅจ ์กฐ์ ˆ ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ -1 ์ถœ๋ ฅ์„ ์œ„ํ•ด ์ดˆ๊ธฐ๊ฐ’ 
ans = -1 
dp = dp[n]
# ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ for ๋ฌธ
for i in range(m, -1, -1):
    if dp[i]==1: #์ตœ๋Œ€๊ฐ’ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ค‘๋‹จ 
        ans = i 
        break 
    # ๊ฐ’์ค‘ 1์ด ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ๋ณผ๋ฅจ์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค.
print(ans)

 

๋ฌธ์ œ๋งํฌ : ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ

 

1495๋ฒˆ: ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ

์ฒซ์งธ ์ค„์— N, S, M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 50, 1 ≤ M ≤ 1,000, 0 ≤ S ≤ M) ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๊ณก์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์˜ ์ฐจ์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด ๊ฐ’์€ 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , M๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

www.acmicpc.net