Có n quả táo với trọng lượng đã biết. Hãy chia toàn bộ táo thành hai nhóm sao cho chênh lệch giữa tổng trọng lượng hai nhóm là nhỏ nhất.
Input
Dòng đầu chứa n. Dòng thứ hai chứa n số nguyên p1,p2,…,pn.
Output
In chênh lệch nhỏ nhất có thể đạt được.
Constraints
1≤n≤20.
1≤pi≤109.
Mỗi quả táo thuộc đúng một trong hai nhóm; một nhóm có thể rỗng.
Scoring
Subtask 1 (50% số điểm): n≤10 và pi≤1000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
5
3 2 7 4 1
Output
1
Giải thích: Chọn nhóm thứ nhất gồm các trọng lượng 3,2,4 có tổng 9; nhóm còn lại có tổng 8, nên chênh lệch nhỏ nhất bằng 1.
Lời giải tóm tắt
Ý tưởng: Duyệt mọi cấu hình hai lựa chọn cho n quả. Tính tổng nhóm thứ nhất s; nhóm còn lại có tổng total-s, nên chênh lệch là |total-2s|. Lấy nhỏ nhất trên mọi cấu hình.
Chứng minh tính đúng đắn: Mỗi cách chia tương ứng duy nhất với tập chỉ số thuộc nhóm thứ nhất, và mỗi tập chỉ số được duyệt đúng một lần. Công thức |total-2s| chính là chênh lệch hai tổng của cấu hình. Vì mọi cách chia đều được đánh giá, giá trị nhỏ nhất thu được là tối ưu.
Độ phức tạp:O(n·2^n) thời gian và O(n) bộ nhớ.
Lỗi cài đặt thường gặp: Dùng chiến lược tham lam luôn đưa quả nặng nhất vào nhóm nhẹ hơn.
Lỗi cài đặt thường gặp: Dùng số nguyên 32 bit cho tổng.
Lỗi cài đặt thường gặp: Không cho phép một nhóm rỗng dù contract cho phép.