Cho hai danh sách weights và values cùng độ dài và một số capacity. weights[i] và values[i] là trọng lượng và giá trị của vật phẩm thứ i. Chỉ được lấy tối đa một lần mỗi vật phẩm và tổng trọng lượng không vượt quá capacity. Tìm giá trị lớn nhất có thể đạt được.
Ví dụ, weights = [2, 3, 4], values = [2, 6, 4], capacity = 6, đầu ra là 8.
Các bước giải quyết (quy hoạch động 0/1 knapsack):
n:= độ dàiweights.- Tạo ma trận
dpkích thước(n+1) x (capacity+1)khởi tạo 0. - Duyệt
itừ 0 đếnn,jtừ 0 đếncapacity:- Nếu
i == 0hoặcj == 0:dp[i][j] = 0. - Ngược lại nếu
weights[i-1] <= j:dp[i][j] = max(dp[i-1][j-weights[i-1]] + values[i-1], dp[i-1][j]). - Ngược lại:
dp[i][j] = dp[i-1][j].
- Nếu
- Trả về
dp[n][capacity].
Ví dụ minh họa
class Solution:
def solve(self, weights, values, capacity):
n = len(weights)
dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]
for i in range(n + 1):
for j in range(capacity + 1):
if i == 0 or j == 0:
dp[i][j] = 0
elif weights[i-1] <= j:
dp[i][j] = max(dp[i-1][j-weights[i-1]] + values[i-1], dp[i-1][j])
else:
dp[i][j] = dp[i-1][j]
return dp[n][capacity]
ob = Solution()
weights = [2, 3, 4]
values = [2, 6, 4]
capacity = 6
print(ob.solve(weights, values, capacity))
Đầu vào
[2, 3, 4], [2, 6, 4], 6
Đầu ra
8