2961번: 도영이가 만든 맛있는 음식
문제 도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다. 지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B��
www.acmicpc.net
n = int(input())
s = []
# 재료 하나를 한 쌍으로써 리스트에 추가한다
for i in range(n) :
s.append(list(map(int, input().split())))
# 모든 부분집합을 돌며 차이를 저장할 공간
ans = []
# slist 의 모든 부분집합을 재귀적으로 돌기
def count(sv, ssv, slist, len) :
global ans
if len == 0:
return;
else :
for i in range(len) :
# 자기 자신 추가
ans.append(abs((slist[i][0] * sv) - (slist[i][1] + ssv)))
# 자기 아래에 종속되어있는 애들을 또 추가
count(slist[i][0] * sv , slist[i][1] + ssv, slist[i+1:], len-i-1)
# 돌려주면 ans 에 부분집합의 값들이 저장됨
count(1, 0, s, n)
# 최솟값 출력
print(min(ans))
# 그림으로 그려보면 다음과 같다
# 1 - 2 - 3 - 4 - 5
# - 5
# - 4 - 5
# - 5
# 1 - 3 - 4
# - 5
# 1 - 4 - 5
# 1 - 5
# 2 - 3 - 4 - 5
# - 5
# - 4 - 5
# - 5
# ...
[Try]
1. 재귀호출을.. 어찌저찌 했다.. 시간이 꽤 오래 걸렸다. 한 1시간 반?
[Point]
1. 리스트.extend() 로 iterable 한 친구들을 붙여주는 방법이 있다
[More]
'PS > BOJ' 카테고리의 다른 글
[백준] 1874.cpp 스택 수열 (0) | 2020.05.18 |
---|---|
[백준] 10993.py : 별 찍기 - 18 (0) | 2020.05.18 |
[백준] 1654.cpp : 랜선 자르기 (0) | 2020.05.16 |
[백준] 2448.py : 별 찍기 - 11 (0) | 2020.05.16 |
[백준] 10989.cpp : 수 정렬하기 3 (0) | 2020.05.15 |