Menu
CoddyTech

0/1 Knapsack Problem

Trung bìnhQuy hoạch độngpython iconjava iconcpp iconc iconjs icon+10

Bạn có n món đồ. Món đồ i nặng weights[i] và có giá trị values[i]. Túi của bạn chứa được tổng trọng lượng tối đa là capacity. Mỗi món đồ chỉ có một món, và bạn có thể chọn mang theo nguyên món hoặc để lại. Hãy trả về tổng giá trị lớn nhất mà bạn có thể mang theo.

Hàm

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

Ràng buộc

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

Ví dụ

Đầu vào
weights = [4, 2, 3, 5]values = [10, 4, 7, 12]capacity = 7
Đầu ra
17
Giải thích
Món đồ 0 và 2 có tổng trọng lượng 4 + 3 = 7 và tổng giá trị 10 + 7 = 17. Nếu xếp món đồ có giá trị cao nhất trước (trọng lượng 5, giá trị 12), bạn chỉ còn chỗ cho món đồ 1, tổng giá trị là 16.
challenge icon

Câu hỏi mở rộng

Giả sử sức chứa có thể đạt đến 10^9, trong khi tổng các giá trị nhiều nhất là 10^4. Bạn sẽ dùng gì làm chỉ số cho bảng?

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

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

weights = [4, 2, 3, 5]
values = [10, 4, 7, 12]
capacity = 7

Đầu ra mong đợi

17