๐ก ์กฐ๊ฑด
- ๋ฏผํธ๋ BOJ ์บ ํ์ ๊ฐ๊ธฐ ์ํด ๊ฐ๋ฐฉ์ ์ธ๋ ค๊ณ ํ๋ค. ๊ฐ๋ฐฉ์ ์ด๋ ํ ๋ฌผ๊ฑด๋ค์ ๋ฃ๋์ ๋ฐ๋ผ ๋ฏผํธ์ ๋ง์กฑ๋๊ฐ ๋ฌ๋ผ์ง๋ค.
- ์ง์ ์๋ ๋ชจ๋ ๋ฌผ๊ฑด๋ค์ ๋ฃ์ผ๋ฉด ๋ฏผํธ๊ฐ ๋๋ ์ ์๋ ๋ง์กฑ๋๋ ์ต๋๊ฐ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ฏผํธ๊ฐ ๋ค ์ ์๋ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ ์ ํด์ ธ ์์ด ์ด๋ฅผ ์ด๊ณผํด ๋ฌผ๊ฑด์ ๋ฃ์์๊ฐ ์๋ค.
- ๋ฏผํธ๊ฐ ๋ง์กฑ๋๋ฅผ ์ต๋๋ก ๋๋ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์๋ณด์.
๋จ, ์ง์ ๋์ผํ ๋ฌผ๊ฑด๋ค์ด ์ฌ๋ฌ๊ฐ๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ํ ๋ฌผ๊ฑด์ ๋๊ฐ ์ด์ ์ฑ๊ธฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- ์ฒซ ๋ฒ์งธ ์ค์ N, M (1 โค N โค 100, 1 โค M โค 10,000) ์ด ๋น์นธ์ ๊ตฌ๋ถ์ผ๋ก ์ฃผ์ด์ง๋ค.
N์ ๋ฏผํธ์ ์ง์ ์๋ ๋ฌผ๊ฑด์ ์ข
๋ฅ์ ์์ด๊ณ M์ ๋ฏผํธ๊ฐ ๋ค ์ ์๋ ๊ฐ๋ฐฉ์ ์ต๋ ๋ฌด๊ฒ๋ค.
- ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑธ์ณ ๋ฏผํธ์ ์ง์ ์๋ ๋ฌผ๊ฑด์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ์ ์ค์ V, C, K (1 โค V โค M, 1 โค C, K โค 10,000, 1 โค V * K โค 10,000) ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
V๋ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ, C๋ ๋ฌผ๊ฑด์ ๊ฐ๋ฐฉ์ ๋ฃ์์ ๋ ์ฌ๋ผ๊ฐ๋ ๋ฏผํธ์ ๋ง์กฑ๋, K๋ ๋ฌผ๊ฑด์ ๊ฐ์์ด๋ค.
- ์ต๋ ๋ฌด๊ฒ๋ฅผ ๋๊ธฐ์ง ์๊ฒ ๋ฌผ๊ฑด์ ๋ด์์ ๋ ๋ฏผํธ๊ฐ ๋๋ ์ ์๋ ์ต๋ ๋ง์กฑ๋๋ฅผ ์ถ๋ ฅํ๋ค.
- ๋
์ ์๊ณ ๋ฆฌ์ฆ, ๋นํธ๋ง์คํน ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
N, M = map(int, input().split())
dp = [0 for _ in range(M+1)]
weight, satisfaction = [], []
for _ in range(N):
V, C, K = map(int, input().split())
idx = 1
while K > 0:
tmp = min(idx, K)
weight.append(V * tmp)
satisfaction.append(C * tmp)
idx *= 2
K -= tmp
for i in range(len(weight)):
for j in range(M, 0, -1):
if j >= weight[i]:
dp[j] = max(dp[j], dp[j-weight[i]] + satisfaction[i])
print(dp[M])
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
2 3
2 7 1
1 9 3
์คํ๊ฒฐ๊ณผ
27
โจ๏ธ ๋ฌธ์ ํ์ด
- ํ๋ฒํ ๋ฐฐ๋ญ ๋ฌธ์ ์๋ฆฌ์ฆ์ด๋ค.
ํ๋ฒํ ๋ฐฐ๋ญ 1 ๋ฌธ์ ๋ ๋
์, DP ๋ฌธ์ ์ด๋ค.
๋ฌผํ์ ์ N, ๋ฒํธ ์ ์๋ ๋ฌด๊ฒ K ๋ผ๊ณ ํ๋ค๋ฉด ์๊ฐ๋ณต์ก๋ O(NK)๋ก ํ์ดํ ์ ์๋ค.
- ํ์ง๋ง ์ด ๋ฌธ์ ๋ ๋ฌผ๊ฑด์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ์ด๋ค. ์ฆ, ๋ฌผ๊ฑด์ด ์ค๋ณต์ผ๋ก ๋ค์ด๊ฐ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ฌผ๊ฑด์ด ์ค๋ณต์ผ๋ก ๋ค์ด๊ฐ ์ ์์ผ๋ฉฐ, V = 1, M = 10000, K = 10000 ์ด๋ผ๊ณ ํ๋ฉด while ๋ฐ๋ณต๋ฌธ์ด ์ฝ 1์ต๋ฒ ๊ฐ๊น์ด ๋๊ฒ ๋๋ค.
์ด๋ฌ๋ฉด ๋ฌด์กฐ๊ฑด TLE. ๋ํ ์ผ๋ฐ ๋
์์์๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ 1์ฐจ์ ๋ฐฐ์ด๋ก ๊ณ์ฐํ ์ ์๋ค.
- O(NM * logK)๋ก ํด๊ฒฐํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐํด๋ด์ผํ๋ค.
๋ค๋ฅธ ๋ถ๋ค์ ํ์ด๋ฅผ ํ์ธํ๋, ๋นํธ๋ง์คํน ์์ด๋์ด๋ฅผ ํตํด์ ์๋ฅผ ํํํ๋ ๊ฒ์ ์ ์ ์์๋ค.
์ด ์์ด๋์ด์ ํต์ฌ์ ๋ชจ๋ ์๋ 2์ ์ ๊ณฑ์๋ค์ ํฉ์ผ๋ก ํํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ง์ฝ ๊ฐ์ ๋ฌผ๊ฑด์ด ์ฝ 15๊ฐ๋ผ๊ณ ํ๋ค๋ฉด ์ด๋ฅผ 2์ ์ ๊ณฑ์๋ค์ ํฉ์ผ๋ก ํํํ์ ๋, 1 + 2 + 4 + 8 ๋ก ํํํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด DP ํ
์ด๋ธ์ 1๊ฐ, 2๊ฐ, 4๊ฐ, 8๊ฐ ์ถ๊ฐํ ๊ฒฝ์ฐ๋ฅผ ๊ฐฑ์ ์์ผ์ฃผ๋ฉด ๋๋ค.
- DP ํ
์ด๋ธ์ M + 1 ๊ฐ ๋ง๋ค์ด์ฃผ๊ณ , ๋ฌด๊ฒ์ ๋ง์กฑ๋๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
- ๋ฐ๋ณต๋ฌธ์ N๋ฒ ์ํํ๋ฉด์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(V), ๋ง์กฑ๋(C), ๋ฌผ๊ฑด์ ๊ฐ์(K)๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
์
๋ ฅ๋ฐ์ ๋ฌผ๊ฑด์ ํ๊ฐ ๋ฃ์์ ๊ฒฝ์ฐ๋ถํฐ 2 ๋ฅผ ๊ณฑํ๋ฉด์ ๋ฃ์ ์ ์๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ฉด์ ๋ง์กฑ๋์ ๋ฌด๊ฒ๋ฅผ ๊ณ์ฐํ๋ค.
๊ณ์ฐํ ๊ฐ ๊ฐ์ weight, satisfaction ๋ฆฌ์คํธ์ ๋ฃ์ด์ค๋ค. idx๋ 2๋ฅผ ๊ณฑํด 2์ ์ ๊ณฑ์๋ก ๋ง๋ค์ด์ค๋ค.
์ด๋ฏธ ๊ณ์ฐํ 2์ ์ ๊ณฑ์๋ ์ ์ธํ ์ ์๋๋ก K์์ tmp๋ฅผ ๋นผ์ค๋ค.
- ์ดํ์ ํ์ด๋ ๋
์์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ๋ค.
weight ๋ฆฌ์คํธ์ ๊ธธ์ด๋งํผ for ๋ฌธ์ ์ํ(i)ํ๊ณ , ๋ค ์ ์๋ ์ต๋ ๋ฌด๊ฒ(M)๋ถํฐ 1๊น์ง -1์ฉ ๋ด๋ ค๊ฐ๋ฉด์ ์ํ(j)ํ๋ค.
- ์ด ๋, j๋งํผ ๋ฌด๊ฒ๋ฅผ ๋ค ์ ์์ ๋, weight ๋ฆฌ์คํธ์ i๋ฒ์งธ์ ํด๋นํ๋ ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์๋ค๋ฉด dp[j]๋ฅผ ์๋์ ๊ฐ์ด ๊ฐฑ์ ํ๋ค.
dp[j] = max(dp[j], dp[j-weight[i]] + satisfaction[i])
- dp[j] ์งธ์ ๊ฐ๊ณผ (dp[ํ์ฌ ๋ค ์ ์๋ ์ต๋๋ฌด๊ฒ - i๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ] + i๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ง์กฑ๋) ๋ฅผ ๋น๊ตํ์ฌ ๊ฐฑ์ ํ๋ค.
๐พ ๋ฐฐ์ด์
- ์๊ทธ๋๋ ์ด๋ ค์ด ๋
์์์ ๋นํธ๋ง์คํฌ์ ๊ฐ๋
์ด ๋ค์ด๊ฐ๋ ๋งค์ฐ ์ด๋ ค์ ๋ค.
- ๋
์๋ ๋
์์ด์ง๋ง, ๋ชจ๋ ์์ฐ์๊ฐ 2์ ๊ฑฐ๋ญ์ ๊ณฑ ์๋ก ๋ํ๋ผ ์ ์๋ค๋ ์์ด๋์ด๋ ์๊ฐ์น๋ ๋ชปํ๋ค.
- (2)๋ฒ์ ์์ด๋์ด๋ฅผ ๊ธฐ์ตํ๊ณ ๋์ค์ ๊ผญ ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ์์ ์ ์ฉํ ์ ์์ด์ผ๊ฒ ๋ค.