๊ทธ๋ฆฌ๋๋ก ๋ชปํธ๋ ๋ฌธ์ ์ด๊ธธ๋ DP์ธ์ค ์๊ณ ์งฐ๋ค๊ฐ
DP๋ ์๋๊ตฌ๋ ์ถ์ด์ DFS ๋น์ทํ๊ฒ ํ์๋ค๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ ์
DFS + DP๋ก ์ฑ๊ณต
๐ผ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9084
- ํฐ์ด: ๊ณจ๋ V
- ๋ถ๋ฅ: ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
โ TRIAL 1.
๋๋ณด๊ธฐ
์ฝ๋
def solution(N, coins, target):
c = coins.pop() #largest
if N == 1:
if target % c == 0:
ans = 1
else:
ans = 0
else:
ans = 0
for i in range(target//c + 1):
ans += solution(N-1, coins, target-c*i)
coins.append(c)
return ans
T = int(input()) #num of test cases
for _ in range(T):
N = int(input()) #num of coins
coins = list(map(int, input().split())) #coins in ascending order
M = int(input()) #target price
print(solution(N, coins, M))
์ฝ๋ ์ค๋ช
- ๊ฐ์ฅ ํฐ coin๋จ์๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ๊ฒ์ฌ.
- ๋จ์ ๊ธ์ก์ ๋๋จธ์ง coin์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด์ ๋ํ ํ return
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ. ๊ฐ์ coins๋ก target์ ๋ง๋๋ ๊ณ์ฐ์ด ์ฌ๋ฌ๋ฒ ๋ฑ์ฅํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ค๊ฐ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ DP๋ฅผ ์ถ๊ฐํด์ผ ํจ.
๐ก Solution
์ฝ๋
from collections import defaultdict
def solution(d, N, coins, target):
if target == 0:
return 1
c = coins.pop() #largest
if N == 1:
if target % c == 0:
ans = 1
else:
ans = 0
else:
key = ' '.join(map(str, [target]+coins))
if d[key] is None:
ans = 0
for i in range(target//c + 1):
ans += solution(d, N-1, coins, target-c*i)
d[key] = ans
else:
ans = d[key]
coins.append(c)
return ans
T = int(input()) #num of test cases
for _ in range(T):
N = int(input()) #num of coins
coins = list(map(int, input().split())) #coins in ascending order
M = int(input()) #target price
d = defaultdict(lambda: None)
print(solution(d, N, coins, M))
์ฝ๋ ์ค๋ช
- DFS + DP
- ๊ฐ์ฅ ํฐ coin๋จ์๋ถํฐ ์์ฐจ์ ์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ๊ฒ์ฌ.
- ๋จ์ ๊ธ์ก์ ๋๋จธ์ง coin์ผ๋ก ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด์ ๋ํ ํ return
- ํน์ coin๋ค๋ก ํน์ target์ ๋ง๋๋ ๊ณ์ฐ์ด ์ฌ๋ฌ๋ฒ ๋ฑ์ฅํ๋ฏ๋ก ์ด๋ฅผ ์ ์ฅํ๋ dp๋ฅผ ์ถ๊ฐํ๋ค.
- target + coin์ ๋ฌธ์์ด๋ก ๋ง๋ค์ด dp์ key๋ก ์ฌ์ฉํ๋ค.
๋ ๋์ ํ์ด
- ํ์ด1: DP bottom-up
- coin์ ํ๋์ฉ ์ํํ๋ฉด์,
- 0๋ถํฐ target๊น์ง์ ๋ชจ๋ ๊ธ์ก์ ๋ํด
- ํ์ฌ coin์ ๋บ ๊ธ์ก์ ๋ํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํ๋ค.
- 0๋ถํฐ target๊น์ง์ ๋ชจ๋ ๊ธ์ก์ ๋ํด
- coin์ ํ๋์ฉ ์ํํ๋ฉด์,
for c in coins:
for i in range(c, target+1):
d[i] += d[i-coin]
print(d[target])
๋ฐ์ํ