canuc80k1001·2/40

Ngân Sách Tối Ưu

Nộp bài trên LQDOJ

Bài 10 · Meet in the Middle

Có công việc độc lập; thực hiện công việc thứ tiêu tốn đơn vị thời gian. Bạn có thể chọn bất kỳ tập công việc nào, kể cả không chọn công việc nào, nhưng tổng thời gian không được vượt quá . Hãy tìm tổng thời gian lớn nhất có thể đạt.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa số nguyên dương .

Output

  • In tổng lớn nhất không vượt quá có thể tạo từ một tập con của dãy.

Constraints

  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5 14
3 5 8 9 12

Output

14

Giải thích: Chọn hai giá trị và được tổng , đúng bằng giới hạn; không phương án hợp lệ nào có thể lớn hơn.

Lời giải tóm tắt
  • Phân tích: Có 2^n tập con. Sau khi chia đôi, với một tổng trái x, lựa chọn tốt nhất bên phải là tổng lớn nhất không vượt T-x.
  • Thuật toán: Liệt kê các tổng không vượt T của hai nửa, sắp xếp danh sách bên phải. Với mỗi tổng trái, dùng upper_bound(T-x) rồi lùi một vị trí để lấy tổng phải lớn nhất hợp lệ và cập nhật đáp án.
  • Chứng minh: Tập con tối ưu tách thành hai tổng x,y xuất hiện trong hai danh sách. Với x cố định, thuật toán chọn đúng giá trị y lớn nhất thỏa y≤T-x, nên không kém phần bên phải của nghiệm tối ưu. Xét mọi x bảo đảm đạt nghiệm tối ưu toàn cục, còn mọi tổng được chọn đều không vượt T.
  • Độ phức tạp: Thời gian O(2^{n/2} log 2^{n/2}), bộ nhớ O(2^{n/2}).