[백준] 19942. 다이어트
2022. 3. 16. 08:55ㆍPython/코딩 문제
# 문제 설명
# 입출력 예시
입력 | 출력 |
6 100 70 90 10 30 55 10 8 100 60 10 10 2 70 10 80 50 0 50 40 30 30 8 60 60 10 70 2 120 20 70 50 4 4 |
134 2 4 6 |
# 코드 풀이
n = int(input())
mp,mf,ms,mv = list(map(int, input().split(' ')))
diets = [list(map(int, input().split(' '))) for _ in range(n)]
costs = []
cost_min = 9999
def dfs(path, rest):
global costs, cost_min
sum_x = sum([diets[i][4] for i in path])
if len([x for x in rest if x > 0]) == 0:
if sum_x < cost_min :
costs = path
cost_min = min(sum_x, cost_min)
return
if len(path) == n:
return
if sum_x > cost_min:
return
for i in range(n):
if i not in path:
dfs(path[:]+[i], [max(0, y-x) for x, y in zip(diets[i], rest)])
dfs([], [mp,mf,ms,mv])
print(cost_min)
for x in costs:
print(x, end=' ')
# 핵심 포인트
- 비용의 최저 값인 cost_min을 함수에서 계속 업데이트 하므로, global로 지정하여 사용한다.
- 최저 값을 찾았더라도 해당 경우에 대해 한 번은 함수를 시작하므로, 모든 노드를 돌거나 최저값을 가질 것 같지 않은 경우 return한다.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[SWEA] 5209. 최소 생산 비용 (0) | 2022.03.17 |
---|---|
[리트코드] 704. Binary Search (0) | 2022.03.14 |
[백준] 13398. 연속합 2 (0) | 2022.03.10 |
[리트코드] 662. 이진트리의 최대 너비 (0) | 2022.03.08 |
백준 3977. 축구 전술 (0) | 2022.03.04 |