Menu
CoddyTech

Fractional Knapsack

Trung bìnhTham lamSắp xếppython iconjava iconcpp iconc iconjs icon+10

Bạn có n món đồ. Món đồ i có giá trị values[i] và cân nặng weights[i]. Túi của bạn chứa được tổng khối lượng tối đa là capacity, và bạn có thể lấy một phần bất kỳ của món đồ: phần món đồ i nặng w có giá trị là values[i] × w / weights[i].

Viết một hàm có tên fractionalKnapsack để trả về tổng giá trị lớn nhất mà túi có thể chứa, làm tròn xuống thành số nguyên.

Hàm

fractionalKnapsack(values: integer-array, weights: integer-array, capacity: integer) → integer
valuesinteger-array
giá trị của từng phần tử
weightsinteger-array
trọng lượng của mỗi món đồ
capacityinteger
trọng lượng tối đa mà túi có thể chứa
Trả vềinteger
tổng giá trị lớn nhất có thể chứa vừa trong túi, làm tròn xuống

Ràng buộc

  • 1 ≤ n ≤ 5000, trong đó n = values.length = weights.length
  • 1 ≤ values[i], weights[i] ≤ 104
  • 1 ≤ capacity ≤ 108

Ví dụ

Đầu vào
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
Đầu ra
151
Giải thích
Mỗi đơn vị trọng lượng, các vật phẩm có giá trị lần lượt là 5, 3, 6 và 2.5. Vật phẩm 2 và 0 được lấy nguyên vẹn, tổng giá trị là 70 và còn chỗ cho 27 đơn vị. Lấy thêm 27 trong số 30 đơn vị của vật phẩm 1, được thêm 81, tổng cộng là 151.
challenge icon

Câu hỏi mở rộng

Bạn có thể tìm đáp án trong thời gian O(n) mà không cần sắp xếp tất cả các mục không?

Đặt lại code
def fractionalKnapsack(values, weights, capacity):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

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

Đầu ra mong đợi

151