숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하기.
입력 | 출력 |
---|---|
11 8 3 2 4 8 7 2 4 0 8 8 | 10 |
40 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 | 7069052760 |
: 재귀호출로 푼다. --> 시간초과
DP로 풀기.
- dp[i][j] = 경우의 수.
- i까지의 원소를 사용하여 j가 나올 수 있는 모든 경우의 수.
- i는 1부터 n-2까지. j는 0부터 21까지.
- 조건에 맞을 때만 경우의 수 ++
- dp[n-2]nums[-1]]이 구하고자 하는 값.
dp..역시 생각해내기 쉽지 않다..ㅠ
n = int(input())
nums = list(map(int, input().split()))
dp = [[0]*21 for _ in range(n)]
dp[0][nums[0]] = 1 # nums인덱스, nums 값
# i번째까지의 원소를 사용해서 j가 나올 수 있는 모든 경우의 수
for i in range(1, n-1): # nums의 수만큼
for j in range(21): # 연산 결과
if dp[i-1][j] != 0: #이전 경우의 수
if j + nums[i] <= 20:
dp[i][j+nums[i]] += dp[i-1][j]
if j - nums[i] >= 0:
dp[i][j-nums[i]] += dp[i-1][j]
print(dp[n-2][nums[-1]])
import sys
def dfs(idx, result):
global cnt
if idx == n-1 :
if result == nums[-1]:
cnt += 1
return
else:
return
tmp = result + nums[idx]
if 0<=tmp<=20:
dfs(idx+1, tmp)
tmp = result - nums[idx]
if 0<=tmp<=20:
dfs(idx+1, tmp)
n = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))
cnt = 0
dfs(1, nums[0])
print(cnt)