1. ๋ฌธ์ ์ค๋ช
1) ๋์์ด๋ ์ฌ๋ฌ ์ฌ๋ฃ๋ฅผ ์ด์ฉํด ์์์ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
2) ๊ฐ ์ฌ๋ฃ๋ ์ผ์ ํ ์์์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์์ด๋ ์ด ์ฌ๋ฃ๋ค์ ์ฌ์ฉํด ํน์ ํ ์ต์ ์์์ ์๊ตฌ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ฉด์ ์ต์ ๋น์ฉ์ผ๋ก ์์์ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
3) ์ด๋, ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
๋ฌธ์ URL: https://www.acmicpc.net/problem/19942
2. ์ ๊ทผ๋ฒ
1) ์ ๋ ฅ๋ฐ๊ธฐ: ์ฌ๋ฃ์ ์์ ๊ฐ ์ฌ๋ฃ์ ์์์ ๋ฐ ๊ฐ๊ฒฉ์ ์ ๋ ฅ๋ฐ์ต๋๋ค.
2) ์ฌ๊ท ํจ์ ์ ์: ๋ชจ๋ ์ฌ๋ฃ๋ฅผ ์ฌ์ฉํ์ ๋์ ์์์์ ๋น์ฉ์ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ฐํ์ฌ ์ต์ ๋น์ฉ์ ๊ตฌํฉ๋๋ค.
3) ๊ฒฐ๊ณผ ์ถ๋ ฅ: ๊ฐ๋ฅํ ์ต์ ๋น์ฉ๊ณผ ๊ทธ์ ํด๋นํ๋ ์ฌ๋ฃ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
3. ์ ๋ต ์ฝ๋
import sys
input = sys.stdin.readline
# ์
๋ ฅ ์ฒ๋ฆฌ
N = int(input()) # ์ฌ๋ฃ์ ๊ฐ์
p, f, s, v = map(int, input().split()) # ์ต์ ํ์ ์์์ (๋จ๋ฐฑ์ง, ์ง๋ฐฉ, ํ์ํ๋ฌผ, ๋นํ๋ฏผ)
igd = [list(map(int, input().split())) for _ in range(N)] # ๊ฐ ์ฌ๋ฃ์ ์์์์ ๊ฐ๊ฒฉ ์ ๋ณด
# ์ด๊ธฐ๊ฐ ์ค์
vol = sys.maxsize # ์ต์ ๋น์ฉ์ ์ ์ฅํ ๋ณ์, ์ด๊ธฐ๊ฐ์ ๋งค์ฐ ํฐ ๊ฐ์ผ๋ก ์ค์
ansIgd = [] # ์ต์ ๋น์ฉ์ ๋ง์กฑํ๋ ์ฌ๋ฃ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
locIgd = [] # ํ์ฌ ์ฌ๊ท ํธ์ถ์์ ์ ํ๋ ์ฌ๋ฃ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ
# ์ฌ๊ท ํจ์ ์ ์
def rec(idx, mp, mf, ms, mv, mVol):
global vol
global ansIgd
global locIgd
# ํ์ฌ๊น์ง์ ์์์์ ๋น์ฉ์ด ์ต์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ ๋น์ฉ์ด ์ต์์ผ ๊ฒฝ์ฐ ๊ฐฑ์
if mp >= p and mf >= f and ms >= s and mv >= v and vol > mVol:
vol = mVol
ansIgd = locIgd.copy() # ํ์ฌ ์ ํ๋ ์ฌ๋ฃ๋ค๋ก ๊ฐฑ์
# ๋ชจ๋ ์ฌ๋ฃ๋ฅผ ๋ค ํ์ธํ ๊ฒฝ์ฐ ์ฌ๊ท ์ข
๋ฃ
if idx == N:
return
# ํ์ฌ ์ฌ๋ฃ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ
locIgd.append(idx+1)
rec(idx+1, mp + igd[idx][0], mf + igd[idx][1], ms + igd[idx][2], mv + igd[idx][3], mVol + igd[idx][4])
# ํ์ฌ ์ฌ๋ฃ๋ฅผ ์ ํํ์ง ์๋ ๊ฒฝ์ฐ
locIgd.pop()
rec(idx+1, mp, mf, ms, mv, mVol)
# ์ฌ๊ท ํจ์ ํธ์ถ ์ด๊ธฐ๊ฐ ์ค์
rec(0, 0, 0, 0, 0, 0)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
if len(ansIgd) > 0:
print(vol)
print(*ansIgd)
else:
print(-1)
4. ์ฝ๋ ์ค๋ช
1. ์ ๋ ฅ๊ฐ ๋ฐ๊ธฐ
• ์ฌ๋ฃ์ ์์ ๊ฐ ์ฌ๋ฃ์ ์์์์ ๊ฐ๊ฒฉ์ ์ ๋ ฅ๋ฐ์ต๋๋ค.
2. ์ฌ๊ท ํจ์ ์ ์
• ์ฌ๊ท ํจ์๋ฅผ ์ ์ํ์ฌ ๋ชจ๋ ์ฌ๋ฃ๋ฅผ ์ฌ์ฉํ์ ๋์ ์์์์ ๋น์ฉ์ ๊ณ์ฐํ๊ณ ์ต์๊ฐ์ ๊ฐฑ์ ํฉ๋๋ค.
3. ์ฌ๊ท ํจ์ ํธ์ถ
• ์ฌ๊ท ํจ์๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ํธ์ถํ์ฌ ๊ณ์ฐ์ ์์ํฉ๋๋ค.
4. ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ
• ์ต์ข ์ ์ผ๋ก ๊ณ์ฐ๋ ์ต์๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
*** ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ํต๊ณผ๋ฅผ ํ์ง ๋ชปํ๊ฒ ๋๋ค......
# ๋ชจ๋ ์ฌ๋ฃ๋ฅผ ๋ค ํ์ธํ ๊ฒฝ์ฐ ์ฌ๊ท ์ข
๋ฃ
if idx == N:
# ํ์ฌ๊น์ง์ ์์์์ ๋น์ฉ์ด ์ต์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ ๋น์ฉ์ด ์ต์์ผ ๊ฒฝ์ฐ ๊ฐฑ์
if mp >= p and mf >= f and ms >= s and mv >= v and vol > mVol:
vol = mVol
ansIgd = locIgd.copy() # ํ์ฌ ์ ํ๋ ์ฌ๋ฃ๋ค๋ก ๊ฐฑ์
return
idx๊ฐ ๋์ ๋๋ฌํ์ง ์์๋ ์ ๋ต ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ ๋ต์ ์ ๋ฐ์ดํธ ํ๊ณ ์ฒ๋ฆฌ๋ฅผ ํ์ง๋ง
์์ ๊ฐ์ด ์ด ์ฝ๋๋ ๋ฐ๋์ ๋ง์ง๋ง idx์ ๋๋ฌํ๋๋ก ์กฐ๊ฑด์ด ๊ฑธ๋ ค ์๊ธฐ ๋๋ฌธ์,
์์์๊ฐ ์๋ ์ฌ๋ฃ ๊ฐ ์๋ค๋ ๊ฐ์ ํ์ ์๋์ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
[๋ฐ๋ก]
3
0 0 0 1
0 0 0 1 1
0 0 0 0 0
0 0 0 0 0
[์ ๋ต์ฝ๋]
๋น์ฉ 1, ์ฌ๋ฃ์ ํ 1
[์ค๋ฅ์ฝ๋]
๋น์ฉ 1, ์ฌ๋ฃ์ ํ 1,2,3
5. Github์ผ๋ก ํ์ธ
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ(๋ฐฑ์ค)_Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ(๋ฐฑ์ค) 1946[์ ์ ์ฌ์] (0) | 2024.06.28 |
---|---|
BOJ(๋ฐฑ์ค) 14501[ํด์ฌ] (0) | 2024.06.25 |
BOJ(๋ฐฑ์ค) 2961[๋์์ด๊ฐ ๋ง๋ ๋ง์๋ ์์] (0) | 2024.06.23 |
BOJ(๋ฐฑ์ค) 2343[๊ธฐํ ๋ ์จ] (0) | 2024.06.21 |
BOJ(๋ฐฑ์ค) 2512[์์ฐ] (0) | 2024.06.21 |