
N๊ฐ์ง์ ๋์ ์ข ๋ฅ๊ฐ ์ฃผ์ด์ก์ ๋ M์ด๋ผ๋ ๊ธ์ก์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ด ๋ฌธ์ ๋ knapsack ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ์ํฌ ์ ์๋ DP ๋ฌธ์ ์ด๋ค.
๋ฐ๋ณต๋ฌธ์ผ๋ก dpํ ์ด๋ธ์ ์กฐ์ฌํ๊ธฐ ์ ์ด๊ธฐ๊ฐ ์ค์ ์ ์ํด ์ฒซ๋ฒ์งธ ๋์ ์ ๋ํ dpํ ์ด๋ธ ๊ฐ์ ์กฐ์ฌํ๋ค.
for j in range(0, total + 1):
if j % coins[0] == 0:
dp[0][j] = 1
์ฒซ๋ฒ์ฌ ๋์ ์ผ๋ก j๋ผ๋ ๊ธ์ก์ ๋ง๋ค ์ ์๋ค๋ฉด 1์ด๋ค.
for i in range(1, n):
for j in range(total + 1):
dp[i][j] = dp[i - 1][j]
if j >= coins[i]:
dp[i][j] += dp[i][j - coins[i]]
์ฆ,
dp[i][j] = dp[i - 1][j]: i๋ฒ์งธ ๋์ ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ (์ด์ ๋์ ์ผ๋ก๋ง ๊ตฌ์ฑ)dp[i][j] += dp[i][j - coin[i]]: i๋ฒ์งธ ๋์ ์ ํ ๋ฒ ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
t = int(input())
for _ in range(t):
n = int(input())
coins = list(map(int, input().split()))
total = int(input())
dp = [[0] * (total + 1) for _ in range(n)]
for j in range(0, total + 1):
if j % coins[0] == 0:
dp[0][j] = 1
print(dp)
for i in range(1, n):
for j in range(total + 1):
dp[i][j] = dp[i - 1][j]
if j >= coins[i]:
dp[i][j] += dp[i][j - coins[i]]
print(dp[n - 1][total])
์ ๋ง knapsack ๊ทธ ์์ฒด์ ๋ฌธ์ ๋ค
์์ง ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด๋ณด์ง๋ ๋ชปํ์ง๋ง ์ ๋ง ์ด๋ ต๋ค.
์ ํ์ ์ธ์ฐ๋ ๊ฒ๋, ๋ญ ๊ด๊ณ์ธ์๋ก ๋ด์ผ๋ ์ง๋ ์ ๋ง ๋ชจ๋ฅด๊ฒ ๋ค.
knapsack ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌํ๊ณ ์์ ๋ง๋
์ด์๋๋ฐ ๊ณ ์ ๋ฌผ๊ฑด์ด ๋์ ์ผ๋ก ๋ฐ๋๊ณ ๊ฐ๋ฐฉ์ด ๊ธ์ก์ผ๋ก ๋ฐ๋ ๋ฌธ์ ์์๋ถํฐ ํค๋งค๋ค๋ ํํ์ด๋ค ์ ๋ง ~