Menu
CoddyTech

Fractional Knapsack

n개의 아이템이 있습니다. 아이템 i의 가치는 values[i]이고 무게는 weights[i]입니다. 가방에 담을 수 있는 총무게는 최대 capacity이며, 아이템의 일부만 가져갈 수도 있습니다. 무게가 w인 아이템 i의 일부 조각의 가치는 values[i] × w / weights[i]입니다.

가방에 담을 수 있는 최대 총가치를 구하고 소수점 이하를 버려 정수로 반환하는 fractionalKnapsack 함수를 작성하세요.

함수

fractionalKnapsack(values: integer-array, weights: integer-array, capacity: integer) → integer
valuesinteger-array
각 항목의 값
weightsinteger-array
각 항목의 무게
capacityinteger
가방이 담을 수 있는 최대 무게
반환값integer
가방에 들어가는 총 가치 중 가장 큰 값(내림 처리)

제약 조건

  • 1 ≤ n ≤ 5000, 여기서 n = values.length = weights.length
  • 1 ≤ values[i], weights[i] ≤ 104
  • 1 ≤ capacity ≤ 108

예제

입력
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
출력
151
설명
무게 단위당 아이템의 가치는 5, 3, 6, 2.5입니다. 아이템 2와 0을 전부 담으면 가치가 70이고, 27의 여유가 남습니다. 아이템 1의 30단위 중 27단위를 더하면 81이 되어 총 151입니다.
challenge icon

후속 질문

모든 항목을 정렬하지 않고 O(n) 시간 안에 답을 찾을 수 있나요?

코드 초기화
def fractionalKnapsack(values, weights, capacity):
    # 여기에 코드를 작성하세요

테스트 #1

테스트 #2

테스트 #3

인자들

values = [40, 90, 30, 50]
weights = [8, 30, 5, 20]
capacity = 40

예상 출력

151