์ฌ๊ท์ ๋ํด์ ๊ณต๋ถํ๋ฉด์ '์ ์ฐจ์งํฅ์ ์ฌ๊ณ '๊ฐ ์๋ '๊ท๋ฉ์ ์ฌ๊ณ '๋ก ์ ๊ทผํด์ผ ํ๋ค๋ ์๊ธธ ๋ค์๋ค. ๊ทธ ๋น์์ ์ด๋ ดํ์ด ์ดํดํ๋ ๋ถ๋ถ์ด ๋์ ํ๋ก๊ทธ๋๋ฐ์ ๊ณต๋ถํ๋ฉด์ ์ข ๋ ์ ๋ช ํ ์ดํด๊ฐ ๋๋ ๊ฒ ๊ฐ์ ๊ธฐ๋กํด๋๊ณ ์ ํ๋ค.
๋ฐฑ์ค 9084
์ด ๋ฌธ์ ๋ ๋์ ์ type์ด ์ฃผ์ด์ง ๋ ์ฃผ์ด์ง ๊ธ์ก์ ๋ง๋๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค. ๋์ ์ ์ต๋, ์ต์ ๊ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ํฉํ ๊ฐ์ ์ถ๋ ฅํด์ผ ํ๋ค.
์ฃผ์ด์ง ๊ธ์ก์์ ์์ํ์ฌ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ฐจ๋๋ก ํ๊ณ ๋ค์ด๊ฐ๋ฉด ๋ณต์กํ๋ค. ๋ํ '์ค๋ณต ๋ถ๋ถ ๋ฌธ์ '๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก DP๋ฅผ ํ์ฉํด๋ณธ๋ค.
1. ํ ์ด๋ธ ์ ์ํ๊ธฐ dp[i] ๋ 'i๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์๋ก ์ ์ํ๋ค. ์ด๋ ๊ฒ ์ ์ํด๋ณธ ์ด์ ๋ ๊ฐ๋จํ dp[์ฃผ์ด์ง ๊ธ์ก] ํ๋ฉด ์ ๋ต์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. 2. ์ ํ์ ์ฐพ๊ธฐ ๋์ ์ ์ข ๋ฅ๊ฐ 3์ข ๋ฅ๋ผ๊ณ ๊ฐ์ ํ ๋ '3์ข ๋ฅ์ ๋์ ์ผ๋ก i๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ฐฉ๋ฒ์ ์ = โ 2์ข ๋ฅ์ ๋์ (๋ง์ง๋ง ๋์ ๊ธ์ก ์ ์ธ)์ผ๋ก i๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ฐฉ๋ฒ์ ์ + โก3์ข ๋ฅ์ ๋์ ์ผ๋ก (i-๋ง์ง๋ง ๋์ ๊ธ์ก)์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๋ฐฉ๋ฒ์ ์'๋ก ํํํ ์ ์๋ค. โ ์ ๋ง์ง๋ง ๋์ ๊ธ์ก์ ์ ์ธ ํ ๊ธ์ก i๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์์ด๋ค. ์ฆ, ๋ง์ง๋ง ๋์ ์์ด ๊ธ์ก i๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์์ด๋ค. โก๋ (i-๋ง์ง๋ง ๋์ ๊ธ์ก)์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ๊ฒฝ์ฐ์ ๋ง์ง๋ง ๋์ ๋ง ์ถ๊ฐํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ๋ธ๋ค. ๋ค์ ๋งํด โ ์์ ๋ง์ง๋ง ๋์ ์ด ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ์ ์๋ ๋ชจ๋ ๊ตฌํ์ผ๋ ๋ง์ง๋ง ๋์ ์ด ๋ฌด์กฐ๊ฑด ํฌํจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ โก์์ ์ ์ ์๋ค. ์๋ฅผ๋ค์ด i = 6,๊ธ์ก 6์ ๋์ 2, 3, 4๋ก ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด๋ณด์. โ ์์ 2์ 3์ ์ด์ฉํด 6์ ๋ง๋๋ ๊ฒฝ์ฐ(2๊ฐ) + โก๋ 2, 3์ผ๋ก (6-4)๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ(1๊ฐ)๋ก ์ด 3๊ฐ์์ ๊ณ์ฐํ ์ ์๋ค. โ , โก๊ฐ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ์ ์ฐจ๋๋ก ๋ณด๋ ๊ฒ์ด ์๋๋ผ ํ ์ด๋ธ์ ์ ์ํ๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฑ๋๋ค๋ ์๊ฐ์ผ๋ก ๋์ด๊ฐ๋ค. 3. ์ ํ์์ ์ํ ์ด๊ธฐ ์กฐ๊ฑด dp ํ ์ด๋ธ์ 0์ผ๋ก ์ด๊ธฐํํ๊ณ , dp index๊ฐ 0์ผ ๋(= 0์ ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์)๋ฅผ 1๋ก ์ค์ (๊ฒฝ์ฐ์ ์์ด๊ธฐ์ ์๋ฌด๊ฒ๋ ์ ํ ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํจ)ํ๋ค. |
t = int(input())
for _ in range(t):
n = int(input())
coin_types = list(map(int, input().split()))
m = int(input())
dp = [0] * (m+1)
dp[0] = 1
coin_types.sort()
for coin in coin_types:
for j in range(1, m+1):
if j >= coin:
dp[j] = dp[j] + dp[j-coin]
print(dp[m])
์ฌ๊ท์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋๋ ์ด๋ค ํจ์ ์์ ํจ์ ์์ผ๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ํจ์๋ฅผ ๊ตฌ์ํ์ง ์์๋ค. ํจ์ ์์ ํจ์๊ฐ ์ด๋ค ๋์์ ํ ๊ฒ์ด๊ธฐ์ ๋ฏฟ๊ณ (?) ๋์ด๊ฐ๋ฉด์ ํจ์๋ฅผ ๊ตฌ์ํ์๋ค. DP์ ์ ํ์์ ๋์ถํ๋ ๊ฒ๋ ์ด์ ์ ์ฌํ๊ฒ ๋๊ปด์ก๋ค. DP ํ ์ด๋ธ ์์ผ๋ก ์ ์ฐจ๋๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ์๊ฐํ๋ ๊ฒ์ด ์๋๋ผ, DP ํ ์ด๋ธ๋ก ์ ์ํ ๊ฐ์ ๋ฑ์ ๊ฒ์ผ๋ก ๋ฏฟ๊ณ ๋์ด๊ฐ๋ค(๊ท๋ฉ์ ์ผ๋ก).
๋ฐฑ์ค 2294
์ด ๋ฌธ์ ๋ ์ ๋ฌธ์ ์ ์ ์ฌํ๋ค. DP๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํผ๋ค. ๋ค๋ฅธ ์ ์ dp๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๋ถ๋ถ์ด๋ค. ์ ๋ฐ์ดํธ ํ๋ ๋ถ๋ถ๋ง ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
...
for i in range(1, k+1):
for coin in coin_type:
if i >= coin:
dp[i] = min(dp[i], dp[i-coin]+1)
else:
break
...
min ํจ์๋ฅผ ์ฌ์ฉํด์ dp[i]๊ฐ ์์์ง, dp[i-coin] +1์ด ์์์ง ๋น๊ตํ๋ค. ๋น๊ต ๋์์ด dp[i]์ dp[i-coin]+1์ธ๋ฐ, dp[i]๋ผ๊ณ ํ๋ฉด ๋ง์ง๋ง ๋์ ์ด ํฌํจ๋์ง ์์ผ๋ฉด์ i๋ฅผ ๋ง๋ค ์ ์๋ ์ต์์ ๊ฐ์์ด๋ค. dp[i-coin]์ (i-coin)๊ธ์ก๊น์ง๋ก ๊ตฌํ ์ต์์ ๊ฐ์์ด๋ฏ๋ก ๋ง์ง๋ง ๋์ ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ์ +1์ ํ๋ค. ์ด ๋ ์ค ์์ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ด๋ค. ์์ ๋ฌธ์ ์ โ , โก์ ๊ฑฐ์ ๋์ผํ ๊ตฌ์กฐ์์ ์ ์ ์๋ค.
๋ณธ ๋ฌธ์ ์์๋ ์ฌ๊ท์ ์ ์ฌํ๊ฒ, dp[i], dp[i-coin]์ ๊ฐ๊ฐ i์ i-coin์ ๋ง๋๋ ์ต์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค๊ณ ๋ฏฟ๊ณ (!) (๊ท๋ฉ์ ์ผ๋ก)์ฝ๋๋ฅผ ์ง ๋ค.
import sys
n, k = map(int, input().split())
coin_type = []
for _ in range(n):
coin_type.append(int(input()))
coin_type = list(set(coin_type))
coin_type.sort()
dp = [54321] * (k+1)
dp[0] = 0
for i in range(1, k+1):
for coin in coin_type:
if i >= coin:
dp[i] = min(dp[i], dp[i-coin]+1)
else:
break
if dp[k] != 54321:
print(dp[k])
else:
print(-1)