๐ฑ ์ฑ
๋ฐฑ์ค Gold3
๋ฌธ์
์ฐ๋ฆฌ๋ ์ค๋งํธํฐ์ ์ฌ์ฉํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ง ์ฑ(App)์ ์คํํ๊ฒ ๋๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ ํ๋ฉด์ ๋ณด์ด๋ โ์คํ ์คโ์ธ ์ฑ์ ํ๋๋ฟ์ด์ง๋ง ๋ณด์ด์ง ์๋ ์ํ๋ก ๋ง์ ์ฑ์ด โํ์ฑํโ๋์ด ์๋ค. ์ฑ๋ค์ด ํ์ฑํ ๋์ด ์๋ค๋ ๊ฒ์ ํ๋ฉด์ ๋ณด์ด์ง ์๋๋ผ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ์ํ๊ฐ ๊ธฐ๋ก๋์ด ์๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ์คํ ์ค์ด ์๋๋๋ผ๋ ์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ ์ด์ ๋ ์ฌ์ฉ์๊ฐ ์ด์ ์ ์คํํ๋ ์ฑ์ ๋ค์ ๋ถ๋ฌ์ฌ ๋์ ์ง์ ์ ์ํ๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ฝ์ด ๋ค์ฌ ์คํ ์ค๋น๋ฅผ ๋น ๋ฅด๊ฒ ๋ง์น๊ธฐ ์ํด์์ด๋ค.
ํ์ง๋ง ์ค๋งํธํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ด๋ผ๋ ์คํํ๋ ๋ชจ๋ ์ฑ์ ํ์ฑํ๋ ์ฑ๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒจ๋๋ค ๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํ๊ฐ ์ค๊ธฐ ์ฝ๋ค. ์๋ก์ด ์ฑ์ ์คํ์ํค๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ์ค๋งํธํฐ์ ์ด์์ฒด์ ๋ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค ์ค ๋ช ๊ฐ๋ฅผ ์ ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ์ญ์ ํ๋ ์๋ฐ์ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ฑ์ โ๋นํ์ฑํโ๋ผ๊ณ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ํฉ์์ ํ์ฑํ ๋์ด ์๋ ์ฑ๋ค์ ๋ฌด์์๋ก ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋งํผ ๋นํ์ฑํ ํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. ๋นํ์ฑํ๋ ์ฑ๋ค์ ์ฌ์คํํ ๊ฒฝ์ฐ ๊ทธ๋งํผ ์๊ฐ์ด ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ฌํ ์ฑ์ ๋นํ์ฑํ ๋ฌธ์ ๋ฅผ ์ค๋งํธํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ผ ํ๋ค
ํ์ฌ N๊ฐ์ ์ฑ, A1, โฆ, AN์ด ํ์ฑํ ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ค ์ฑ Ai๋ ๊ฐ๊ฐ mi ๋ฐ์ดํธ๋งํผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ํ, ์ฑ Ai๋ฅผ ๋นํ์ฑํํ ํ์ ๋ค์ ์คํํ๊ณ ์ ํ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๋น์ฉ(์๊ฐ ๋ฑ)์ ์์นํ ํ ๊ฒ์ ci ๋ผ๊ณ ํ์. ์ด๋ฌํ ์ํฉ์์ ์ฌ์ฉ์๊ฐ ์๋ก์ด ์ฑ B๋ฅผ ์คํํ๊ณ ์ ํ์ฌ, ์ถ๊ฐ๋ก M ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ์. ์ฆ, ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, โฆ, AN ์ค์์ ๋ช ๊ฐ๋ฅผ ๋นํ์ฑํ ํ์ฌ M ๋ฐ์ดํธ ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ํ๋ณดํด์ผ ํ๋ ๊ฒ์ด๋ค. ์ฌ๋ฌ๋ถ์ ๊ทธ ์ค์์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ ci์ ํฉ์ ์ต์ํํ์ฌ ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ 3์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ ์ค์๋ ์ ์ N๊ณผ M์ด ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ฉฐ, ๋์งธ ์ค๊ณผ ์ ์งธ ์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์ ์๊ฐ ๊ณต๋ฐฑ๋ฌธ์๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ N๊ฐ์ ์ ์๋ ํ์ฌ ํ์ฑํ ๋์ด ์๋ ์ฑ A1, โฆ, AN์ด ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์์ธ m1, โฆ, mN์ ์๋ฏธํ๋ฉฐ, ์ ์งธ ์ค์ ์ ์๋ ๊ฐ ์ฑ์ ๋นํ์ฑํ ํ์ ๊ฒฝ์ฐ์ ๋น์ฉ c1, โฆ, cN์ ์๋ฏธํ๋ค
๋จ, 1 โค N โค 100, 1 โค M โค 10,000,000์ด๋ฉฐ, 1 โค m1, โฆ, mN โค 10,000,000์ ๋ง์กฑํ๋ค. ๋ํ, 0 โค c1, โฆ, cN โค 100์ด๊ณ , M โค m1 + m2 + โฆ + mN์ด๋ค.
์ถ๋ ฅ
ํ์ํ ๋ฉ๋ชจ๋ฆฌ M ๋ฐ์ดํธ๋ฅผ ํ๋ณดํ๊ธฐ ์ํ ์ฑ ๋นํ์ฑํ์ ์ต์์ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ํ ์ค์ ์ถ๋ ฅํด์ผ ํ๋ค.
์์ ์ ๋ ฅ 1
5 60
30 10 20 35 40
3 0 3 5 4
์์ ์ถ๋ ฅ 1
6
๐ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ
์ฒ์์๋ ํฌํฌ์ธํฐ๋ฅผ ๋ ์ฌ๋ ธ๋ค. cost0๋ถํฐ cost n-1๊น์ง ๊ฒ์ฌ๋ฅผ ํด๋ณด๋ฉด์ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ๋ค๋ฉด ํด๋น ๋น์ฉ๋ค์ ํฉ์ returnํด์ฃผ๋ฉด ๋ ๊ฒ์ด๊ณ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค๋ฉด ์ด๋ฅผ 1 ๋ฐ์ดํธ ์ฆ๊ฐ์์ผ์ ์ฌํ์์ ํ๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ์์์ ๋น์ฉ์ ๋ถ๋ถ ์ฐ์ ์์ด์ด ์๋๋ค. ๋ค์ ๋งํด, index๋ฅผ ๋ฌด์์๋ก ์ ์ ํด์ ํฉํด๋ ๋๋ฏ๋ก ํฌํฌ์ธํฐ๋ฅผ ํ์ฉํ๊ธฐ์๋ ์ ์ ์น ์๋ค.
์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ์ ์ด ๋ฌธ์ ๋ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ๋ถ๋ฅ๋์ด ์๋ค. ๋ฐฐ๋ญ ๋ฌธ์ ๊ฐ ๋ฌด์์ผ๊น?
Knapsack Algorithm
๋ ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ๋ฐฐ๋ญ ๋ฌธ์ ๋ ๋๋์ด ๋ฐฐ๋ญ์ ์ฌ๋ฌ ๊ฐ์ ์ง์ ํ์ณ์ ๋ฌ์๋๋ ค๊ณ ํ๋๋ฐ ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ๋ฌด๊ฒ๋ ํ์ ์ ์ด๊ธฐ์ ์ต๋ํ ๊ฐ์น๊ฐ ๋์ ๊ฒ์ ๋ด์๊ฐ๋ ค๊ณ ํ๋ ๋ฌธ์ ์ด๋ค.
์ธ๋ป ๋ณด๋ฉด ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํด๋ณด์ด์ง๋ง ์ฐจ์ด์ ์ด ๋ฌด์์ผ๊น? ๐ง
๋ค์ ์ง๋ฌธ์ ๋ต์ ํด๋ณด์. ใ ใ
๋ฐฐ๋ญ = ๋ฌด๊ฒ ํ๊ณ 15kg
A = ๊ฐ์น 10 , ๋ฌด๊ฒ 13kg
B = ๊ฐ์น 6, ๋ฌด๊ฒ 6kg
C = ๊ฐ์น 5, ๋ฌด๊ฒ 6kg
๋ฐฐ๋ญ์ ์ต๋ํ ๊ฐ์น๊ฐ ๋๊ฒ ์ธ๋ ค๊ณ ํ๋๋ฐ ์ด๋ฅผ ๊ทธ๋ฆฌ๋ํ๊ฒ ์ ๊ทผํ๋ฉด A๋ฅผ ๋ด๊ณ ๋์ด ๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ต์ B์ C๋ฅผ ๋ด์ ๊ฐ์น 11์ ๋ฐฐ๋ญ์ด ์ต๋ ๊ฐ์น์ด๋ค.
์ด๋ฅผ ์ํ์ฌ ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๊ณ ์ด๋ Dynamic Programming์ผ๋ก ๊ตฌํํ๋ค!
์ด์ฒ๋ผ ๋ฌผ๊ฑด์ ๋๋ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ [0-1 ๋ ์ ์๊ณ ๋ฆฌ์ฆ]์ด๋ผ๊ณ ์นญํ๋ค.
๋ฐ๋ฉด์ ๋ฌผ๊ฑด์ ๋๋ ์ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ ๊น? [Fraction ๋ ์ ์๊ณ ๋ฆฌ์ฆ]์ ๊ทธ๋ฆฌ๋๋ก๋ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
์์ ๊ฐ์ด ๋ฌผ๊ฑด์ ๊ฐ์น๋ฅผ ๋ฌด๊ฒ๋ก ๋๋์ด ๋จ๊ฐ๋ฅผ ๋ง์ถ ๋ค์, ์ต๋ํ ์ด๋์ ๋ณด๋ ๋จ๊ฐ๋ก ๊ณ์ ์ฑ๊ฒจ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ [0-1 ๋ ์ ์๊ณ ๋ฆฌ์ฆ]์ผ๋ก ๋ถ๋ฅํ ์ ์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง ๋๋ฌธ์ด๋ค.
- ๋ฐฐ๋ญ ๐๐ป ํ๋ณดํด์ผ ํ๋ ๋ฉ๋ชจ๋ฆฌ
- ์ง์ ๋ฌด๊ฒ ๐๐ป ์ฑ์ ๋ฉ๋ชจ๋ฆฌ
- ๊ฐ์น ๐๐ป ๋น์ฉ
- ์ฑ ๐๐ป ๋๋์ด์ง ์ ์์
๐ ๊ณผ์ ์ค๊ณ/๊ด๋ฆฌ
์ต์ข DP ํ ์ด๋ธ์ ์์ ๊ฐ์๋ฐ ์ค์ ๋ถ๋ถ์ธ ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ์ฃผ๋ชฉํ์.
ํ์ฌ ์์น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ 20์ธ 3๋ฒ ์ฑ์ ์์นํด์๊ณ 3๋ฒ ์ฑ์ ๋น์ฉ์ 3์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฉ์ด 0๋ถํฐ 15๊น์ง(๋ชจ๋ ์ฑ์ ๋ค ๊ป์ ๋ ๋น์ฉ์ด 15์ด๋๊น) ๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ ํ๋ณดํ ์ ์๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
์ด๋ฌํ ์ํฉ์์ ๋ค์ 4๋ฒ ์ฑ์ผ๋ก ๋์ด๊ฐ๋ ค๊ณ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ๋ 35๋ฐ์ดํธ์ด๊ณ ๋น์ฉ์ 5๋ค. ๋์ผํ๊ฒ ๋น์ฉ์ด 0๋ถํฐ 15๊น์ง ๋ชจ๋ ๊ฒฝ์ฐ์ ํ๋ณด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌํ ๊ฑด๋ฐ
0~4๊น์ง๋ ์ด์ dp๋ฐฐ์ด๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค. ์๋ํ๋ฉด ์ด์ฐจํผ 4๋ฒ์ฑ์ ๋๋ฉด 5์ ๋น์ฉ์ด ์๋ชจ๋๋๋ฐ 0~4 ๋น์ฉ์ผ๋ก๋ ๋ง์กฑ์ํค์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋น์ฉ 5 ์ด์๋ถํฐ๋ 4๋ฒ์ฑ์ ๊ป์๋์ ์๋ ๋๋ก ๊ตฌ๋ถํ์ฌ ์ต๋ ํ๋ณด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ฉด ๋๋ค.
๐จ๐ปโ๐ป CODE
import sys
input = sys.stdin.readline
N, necessity = map(int,input().split())
memory = [0] + list(map(int,input().split()))
cost = [0] + list(map(int,input().split()))
# dp[i][j]: i๋ฒ์งธ์ ์ฑ & j ๋น์ฉ์ผ๋ก ์ต๋ ํ๋ณด ๋ฉ๋ชจ๋ฆฌ
dp = [[0]*(sum(cost)+1) for _ in range(len(cost))]
minimum = sum(cost)
for i in range(1,len(cost)):
for j in range(sum(cost)+1):
if cost[i] > j:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j],memory[i]+dp[i-1][j-cost[i]])
if dp[i][j] >= necessity:
minimum = min(minimum,j)
print(minimum)