작은 문제와 큰 문제간 관계 이용, 이전의 해 재활용
한 번 계산한 값을 저장해 두었다가 재사용하기 위해 memoization 필요
def handshake(n):
'''
Return the number of ways to pair 2n vertices around a circle, such that the lines connecting pairs do not cross one another
Input:
n -- number of vertices
'''
assert type(n) == int, "n = {n} must be an integer" # 입력이 올바른지 확인하는 부분
assert n>=0 and n<=100, f"n={n} must be >=0 and <=100"
'''
Write your codes below
'''
memo = [1]
if (len(memo) > n):
return memo[n]
for i in range(len(memo), n+1):
sum = 0
for j in range(i):
# sum += handshake(n - 1 - j) * handshake(j)
sum += memo[i - 1 - j] * memo[j]
memo.append(sum)
return memo[n]
memoization 안 해서 생긴 문제
-> memo 하는 것으로 해결
knapsack_memo = {'loads': [], 0: 0}
def knapsack(n, loads):
# n: 배낭 크기, loads: item 목록 (3-tuple : 짐 이름, 짐 하나 크기, 짐 하나 가치)
global knapsack_memo # 해결
if (knapsack_memo['loads'] == loads):
pass
else:
knapsack_memo = {'loads': loads, 0: 0}
if (n in knapsack_memo):
return knapsack_memo[n]
values = []
for i in range(len(loads)):
if (n >= loads[i][1]):
values.append(loads[i][2] + knapsack(n - loads[i][1], loads))
# 배낭에 들어가는 짐의 최대 가치 합 반환
if (len(values) == 0):
knapsack_memo[n] = 0
return 0
knapsack_memo[n] = max(values)
return max(values)
전역변수를 지역변수로 호출해서 발생
global 키워드 사용함으로써 해결