Cái túi - Meet in the Middle
Xem dưới dạng PDF
Gửi bài giải
Điểm:
1
Giới hạn thời gian:
2.0s
Giới hạn bộ nhớ:
256M
đầu vào:
stdin
Đầu ra:
stdout
Kiểu bài tập
An có một chiếc túi chịu được tối đa trọng lượng W. Có N món đồ, mỗi món đồ i có trọng lượng w_i và giá trị v_i. Hãy chọn một số món đồ bỏ vào túi sao cho tổng trọng lượng không vượt quá W và tổng giá trị là lớn nhất.
Với N ≤ 40, thuật toán quy hoạch động thông thường O(N×W) không khả thi. Sử dụng Meet in the Middle:
- Chia đồ làm 2 nửa, sinh tất cả tổ hợp (trọng lượng, giá trị) của mỗi nửa.
- Sắp xếp nửa thứ hai theo trọng lượng, loại bỏ các tổ hợp bị trội (cả trọng lượng lớn hơn và giá trị nhỏ hơn).
- Với mỗi tổ hợp ở nửa đầu, dùng binary search tìm tổ hợp tốt nhất ở nửa thứ hai.
Đầu vào
- Dòng đầu tiên chứa hai số nguyên N (1 ≤ N ≤ 40) và W (1 ≤ W ≤ 10^18).
- N dòng tiếp theo, mỗi dòng chứa hai số nguyên w_i (1 ≤ w_i ≤ 10^9) và v_i (1 ≤ v_i ≤ 10^9).
Đầu ra
Một số nguyên là tổng giá trị lớn nhất.
Ví dụ
Input:
4 10
5 10
3 7
2 5
4 8
Output:
22
Giải thích
Chọn đồ 1 (5,10), đồ 2 (3,7), đồ 3 (2,5): tổng trọng 10, tổng giá trị 22.
Nhận xét