ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

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

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

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ์—ฐ์ฃผํ•  ๊ณก๊ณผ ํ˜„์žฌ ๋ณผ๋ฅจ, ์ตœ๋Œ€ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ ๊ฐ ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ๋ณผ๋ฅจ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์€ ํ˜„์žฌ ์—ฐ์ฃผ๊ณก์ด 1๋ฒˆ์ด๋ผ๋ฉด ๋ณผ๋ฅจ ๋ฆฌ์ŠคํŠธ 1๋ฒˆ์˜ ๋ณผ๋ฅจ ํฌ๊ธฐ๋งŒํผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋”ํ•˜์—ฌ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ตœ๋Œ€ ๋ณผ๋ฅจ๋ณด๋‹ค๋Š” ์ž‘์„ ๊ฒฝ์šฐ์—๋งŒ ์—ฐ์ฃผ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ ์—ฐ์ฃผ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค ๋ณด๋ฉด -1์„ ์ถœ๋ ฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 

 ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ ‘ํ•˜์˜€์„ ๋•Œ๋Š” ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์„ -ํ•˜๊ฑฐ๋‚˜ +ํ•˜์—ฌ์•ผ ํ•˜๋ฏ€๋กœ, DFS๋กœ ํ’€์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ DFS๋กœ ํ’€ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ DP๋ฅผ ํ†ตํ•ด ํ’€์–ด์•ผ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑธ DP๋กœ ์–ด๋–ป๊ฒŒ ํ’€์ง€ ๊ณ„์† ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

 

 ํ’€์ด ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ, list[์—ฐ์ฃผํ•˜๋Š” ๊ณก์˜ ์ˆ˜][์ตœ๋Œ€ ๋ณผ๋ฅจ]์œผ๋กœ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
  • list[0]์€ ์•„๋ฌด๊ฒƒ๋„ ์—ฐ์ฃผํ•˜์ง€ ์•Š์€ ์ƒํƒœ, ์ตœ์ดˆ์— ๋ณผ๋ฅจ์„ ์ ์šฉํ•œ ์ƒํƒœ์ด๋ฏ€๋กœ list[0][s] = True์ด๋‹ค.
  • 2์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์ˆœํšŒํ•˜๋ฉด์„œ list[1], list[2] ... ๋กœ ์ ‘๊ทผํ•˜๋ฉฐ ๋ณผ๋ฅจ์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•œ๋‹ค.
  • n * m ๋งŒํผ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ์ˆœํšŒํ•˜๋ฉด, list[n]์— ์ตœ๋Œ€ ๋ณผ๋ฅจ์„ ์ฒดํฌํ•œ๋‹ค.
    • ๋งŒ์•ฝ list[n]์— ์ฒดํฌ๋œ ๋ณผ๋ฅจ์ด ์—†๋‹ค๋ฉด, ๋งˆ์ง€๋ง‰ ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ฆ‰ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ณผ์ •์„ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ฒดํฌํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต๋ฌธ์˜ ์ˆœํšŒ๋งŒ ํ•„์š”ํ•œ ์ž‘์—…์ด๋ฏ€๋กœ N*M์˜ ํฌ๊ธฐ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด DFS๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ

from sys import stdin


if __name__ == "__main__":
    n, s, m = map(int, stdin.readline().split())
    v = list(map(int, stdin.readline().split()))

    answer = [[False for _ in range(m + 1)] for _ in range(n + 1)]
    answer[0][s] = True

    for play_song in range(1, n + 1):
        for volume in range(m + 1):
            if not answer[play_song - 1][volume]:
                continue
            next_volume = v[play_song - 1]
            if volume + next_volume <= m:
                answer[play_song][volume + next_volume] = True

            if volume - next_volume >= 0:
                answer[play_song][volume - next_volume] = True

    try:
        print(m - answer[-1][::-1].index(True))
    except:
        print(-1)

 

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€