Cái túi - Meet in the Middle

Xem dưới dạng PDF

Gửi bài giải


Điểm: 30
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 \le 40\), thuật toán quy hoạch động thông thường O(\(N\timesW\)) 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 \le N \le 40\)) và W (\(1 \le W \le 10^18\)).
  • N dòng tiếp theo, mỗi dòng chứa hai số nguyên \(w_i\) (\(1 \le w_i \le 10^9\)) và v_i (\(1 \le v_i \le 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.

Ràng buộc & Subtasks

Subtask Điểm Ràng buộc
1 30% Tương ứng với các bộ test có kích thước nhỏ
2 70% Không có ràng buộc gì thêm ngoài định dạng đầu vào

Nhận xét

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