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á Wtổ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:

  1. 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.
  2. 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).
  3. 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

Không có ý kiến tại thời điểm này.