Cho hai danh sách weights, values cùng độ dài và dung lượng capacity. Mỗi vật phẩm có thể lấy số lượng không giới hạn. Tìm giá trị lớn nhất có thể đạt được.
Ví dụ: weights = [1, 2, 3], values = [1, 5, 3], capacity = 5 → 11.
Quy trình giải quyết (Quy hoạch động đệ quy + Memoization)
- Định nghĩa hàm
dp(i, k): giá trị lớn nhất từ vật phẩmitrở đi với dung lượng còn lạik. - Nếu
i == len(weights), trả về 0. ans = dp(i+1, k)(không lấy vật phẩmi).- Nếu
k >= weights[i], cập nhậtans = max(ans, dp(i, k - weights[i]) + values[i])(lấy vật phẩmi). - Trả về
ans. - Gọi
dp(0, capacity).
Ví dụ mã nguồn
class Solution:
def solve(self, weights, values, capacity):
from functools import lru_cache
@lru_cache(None)
def dp(i, k):
if i == len(weights):
return 0
ans = dp(i + 1, k)
if k >= weights[i]:
ans = max(ans, dp(i, k - weights[i]) + values[i])
return ans
return dp(0, capacity)
ob = Solution()
weights = [1, 2, 3]
values = [1, 5, 3]
capacity = 5
print(ob.solve(weights, values, capacity)) # Output: 11
Đầu vào
[1, 2, 3], [1, 5, 3], 5
Đầu ra
11