canuc80k0046·47/50

Chia Táo Thành Hai Nhóm

Nộp bài trên LQDOJ

Bài 00 · Brute Force

Có 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 . Dòng thứ hai chứa số nguyên .

Output

  • In chênh lệch nhỏ nhất có thể đạt được.

Constraints

  • .
  • .
  • Mỗi quả táo thuộc đúng một trong hai nhóm; một nhóm có thể rỗng.

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( 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 có tổng ; nhóm còn lại có tổng , nên chênh lệch nhỏ nhất bằng .

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.