http://acmicpc.net/problem/19942
{코드}
def calculate(do, picked, pick_sum):
global chosen, tot_prc
if pick_sum[4] >= tot_prc:
return
for i in range(4):
if req_nut[i] > pick_sum[i]:
break
else:
chosen = picked.copy()
tot_prc = pick_sum[4]
return
if do == n:
return
picked.append(do+1)
for i in range(5):
pick_sum[i] += nuts[do][i]
calculate(do+1, picked, pick_sum)
picked.pop()
for i in range(5):
pick_sum[i] -= nuts[do][i]
calculate(do+1, picked, pick_sum)
return
inf = 9876543210
n = int(input())
req_nut = tuple(map(int, input().split()))
nuts = tuple(tuple(map(int, input().split())) for _ in range(n))
chosen = []
tot_prc = inf
calculate(0, [], [0]*5)
if tot_prc == inf:
print(-1)
else:
print(tot_prc)
print(*chosen)
{설명}
이 문제는 모든 경우의 수를 확인해야 하기 때문에 DFS를 사용하여 문제를 풀게 됩니다.
먼저 입력을 받은 후 DFS, 즉 calculate 함수가 실행됩니다.
먼저 현재 비용이 현재 최소 비용보다 크면 최소 비용이 업데이트 되지 않고 같으면 사전순으로 앞선 것이 이미 저장되어 있기에 무시합니다.
그 후, 만약 고른 식재료들의 영양소들의 합이 최소 영양소 기준보다 크다면 최소 비용과 고른 영양소를 업데이트합니다.
만약 하나라도 최소 기준보다 작으면 테스트할 영양소인 do를 포함한 결과와 포함하지 않은 결과를 모두 calculate합니다.
만약 do가 n 이상이면 해당하는 영양소가 존재하지 않으므로 바로 리턴합니다.
마지막에 최소 비용이 없데이트 되지 않았다면 -1을 아니면 최소 비용과 선택한 영양소들을 출력합니다.
'알고리즘 공부 > BOJ백준 풀이' 카테고리의 다른 글
[백준 2580번-파이썬] 스도쿠 (0) | 2021.06.14 |
---|---|
[백준 1062번-파이썬/Python] 가르침 (0) | 2021.06.04 |
[백준 19941번-파이썬] 햄버거 분배 (0) | 2021.05.08 |
[백준 10866번-C++] 덱 (0) | 2021.05.07 |
[백준 10845번-C++] 큐 (0) | 2021.05.07 |