Có n công việc độc lập; thực hiện công việc thứ i tiêu tốn ai đơ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á T. 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 n và T.
Dòng thứ hai chứa n số nguyên dương a1,a2,…,an.
Output
In tổng lớn nhất không vượt quá T có thể tạo từ một tập con của dãy.
Constraints
1≤n≤40.
1≤T≤109.
1≤ai≤109.
Scoring
Subtask 1 (50% số điểm): n≤20.
Subtask 2 (50% 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ị 5 và 9 được tổng 14, đú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}).