๐ ๋ฌธ์ ํ์ํ๊ธฐ
- N๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด (1 ≤ N ≤ 20)
- ์ด ์์ด์ ํฌ๊ธฐ๊ฐ ์์์ธ ๋ถ๋ถ ์์ด ์ค ๊ทธ ์์ด์ ์์์ ํฉ์ด S(|S| ≤ 1,000,000)๊ฐ ๋๋ ๊ฒฝ์ฐ์ ์
- ๋ถ๋ถ ์์ด์ ๊ฐ๋
- ์ฃผ์ด์ง ์์ด์์ ๊ฐ ์์๋ ํฌํจ๋๊ฑฐ๋ ํฌํจ๋์ง ์์ ์ ์๋ค. ์ฆ, ๋ถ๋ถ ์์ด์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๊ธฐ ์ํด 2^N-1(๋น ์์ด ์ ์ธ)๊ฐ์ ๋ถ๋ถ ์์ด์ ํ์ธํด์ผ ํ๋ค.
N์ ํฌ๊ธฐ๊ฐ ์ต๋ 20์ผ๋ก, ์ต๋ ๊ธธ์ด์ธ ๊ฒฝ์ฐ์ ๋ถ๋ถ ์์ด์ ๊ฐ์๋ 2^20 - 1์ด๋ฏ๋ก ๋ชจ๋ ๋ถ๋ถ ์์ด์ ๋ํด ํฉ์ ๊ตฌํด ์ฃผ์ด์ง S์ ๋น๊ตํด๋ณด์๋ ์๊ฐ ๋ด์ ๋ฌธ์ ๋ฅผ ํ์ดํ ์ ์๋ค.
๋ชจ๋ ๋ถ๋ถ ์์ด์ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๊ธฐ ์ํด ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- N๊ณผ S๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ์์ด์ ์์๋ค seq ๋ฆฌ์คํธ๋ก ์ ๋ ฅ๋ฐ๋๋ค.
- ๋ชจ๋ ์์์ ํฉ์ด S์ธ ๋ถ๋ถ ์์ด์ ๊ฐ์๋ฅผ ์ ์ฅํ ๋ณ์ count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ์ฌ๊ท ํจ์ calc_subseq_sum๋ฅผ ํตํด n๋ฒ์งธ ์์น์ ์์๋ฅผ ๋ถ๋ถ ์์ด์ ํฌํจ์ํค๋ ๊ฒฝ์ฐ, ์๋ ๊ฒฝ์ฐ๋ก ๋๋์ด ์ฌ๊ท์ ์ผ๋ก ๋ถ๋ถ ์์ด์ ํฉ์ ๊ตฌํ๋คโถ ํด๋น ๊ณผ์ ์์ ํ์ฌ ์ ํ๋ ์์ ๊ฐ์๋ฅผ ๊ฐ์ด ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์, ๋น ๋ถ๋ถ ์์ด์ ๊ฒฝ์ฐ๋ ํ์ธํ์ง ์๋๋ก ํ๋ค.
- ์ฌ๊ท ํจ์๊ฐ ์คํ๋๋ ๋์, ๋ถ๋ถ ์์ด์ ํฉ์ S์ ๋น๊ตํ์ฌ ํฉ๊ณ๊ฐ ์ ํํ S์ด ๊ฒฝ์ฐ count๋ฅผ 1 ์ฆ๊ฐ ์ํจ๋ค.
- count๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ์ ๋ต ์ฝ๋
def calc_subseq_sum(idx, cur_sum, selected_cnt): # ํ์ฌ ์์ index, ํ์ฌ๊น์ง์ ํฉ
global count
if idx == N:
if cur_sum == S and selected_cnt:
count += 1
return
calc_subseq_sum(idx+1, cur_sum + seq[idx], selected_cnt+1)
calc_subseq_sum(idx+1, cur_sum, selected_cnt)
N, S = map(int, input().split())
seq = list(map(int, input().split()))
count = 0
calc_subseq_sum(0, 0, 0)
print(count)
728x90