Có n đồng xu, đồng thứ i có giá trị xi. Mỗi đồng xu được dùng nhiều nhất một lần. Hãy liệt kê mọi tổng dương khác nhau có thể tạo bởi một tập con các đồng xu.
Input
Dòng đầu chứa n.
Dòng thứ hai chứa n số nguyên x1,x2,…,xn.
Output
Dòng đầu in số lượng tổng dương có thể tạo.
Dòng thứ hai in các tổng đó theo thứ tự tăng dần.
Constraints
1≤n≤100.
1≤xi≤1000.
Tổng mọi xi không vượt quá 105.
Scoring
Subtask 1 (50% số điểm): n≤15 và xi≤20.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
3
2 3 7
Output
7
2 3 5 7 9 10 12
Giải thích: Các tập con không rỗng tạo được các tổng 2,3,7,2+3=5,2+7=9,3+7=10 và 2+3+7=12. Sau khi sắp tăng có đúng bảy tổng.
Lời giải tóm tắt
Mô hình và ý tưởng: Khởi tạo bit 0; với mỗi w cập nhật possible |= possible << w, rồi quét các bit dương.
Chứng minh tính đúng đắn: Quy nạp theo số đồng xu. Trước bước, bit s biểu diễn đúng các tổng từ các đồng đã xét; không dùng đồng mới giữ s, dùng nó tạo s+w, chính là phép dịch rồi OR. Vì vậy trạng thái cuối chứa đúng mọi tổng và quét tăng cho danh sách đúng thứ tự.
Độ phức tạp: O(nS/w) thời gian và O(S/w) bộ nhớ, với S là tổng giá trị đồng xu.
Lỗi cài đặt thường gặp: gán dp=dp<<w; duyệt tổng tăng dần thành unbounded knapsack.