canuc80k1502·3/50

Chuyến Thang Máy

Nộp bài trên LQDOJ

Bài 15 · Bitmask DP

Có người cần đi thang máy. Người thứ nặng , còn thang máy chở được tối đa đơn vị cân nặng trong một lượt.

Mỗi người phải tham gia đúng một lượt. Một lượt có thể chở bất kỳ nhóm người nào miễn tổng cân nặng của nhóm không vượt quá .

Hãy tìm số lượt ít nhất để đưa tất cả mọi người đi.

Input

  • Dòng đầu chứa hai số nguyên .
  • Dòng thứ hai chứa số nguyên .

Output

  • In số lượt thang máy nhỏ nhất cần dùng.

Constraints

  • .
  • .
  • .

Scoring

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

Example

Test 1

Input

5 10
2 3 5 6 4

Output

2

Giải thích: Có thể xếp ba người nặng vào một lượt và hai người nặng vào lượt còn lại. Mỗi lượt đều đạt đúng sức chứa nên hai lượt là đủ.

Lời giải tóm tắt
  • Ý tưởng: Với mỗi tập người mask, lưu cặp dp[mask] = (rides, load): số lượt ít nhất và, trong số các cách dùng số lượt đó, tải nhỏ nhất của lượt cuối. So sánh các cặp theo thứ tự từ điển.
  • Ý tưởng: Khởi tạo dp[0]=(1,0). Để tính mask, thử chọn người i là người được thêm cuối cùng từ mặt nạ thu được khi bỏ i khỏi mask. Nếu tải lượt cuối cộng w_i không vượt X, đặt người đó vào lượt cuối; ngược lại tăng số lượt và bắt đầu lượt mới với tải w_i.
  • Ý tưởng: Chứng minh đúng. Trong một cách xếp tối ưu của mask, bỏ người được thêm cuối cùng cho một cách xếp hợp lệ của tập nhỏ hơn. Theo quy nạp, DP giữ cặp tốt nhất của tập đó. Quy tắc thêm người phản ánh chính xác hai khả năng: vào lượt cuối hoặc mở lượt mới. Khi số lượt bằng nhau, tải lượt cuối nhỏ hơn không bao giờ bất lợi cho người được thêm sau, nên thứ tự từ điển giữ đủ thông tin tối ưu.
  • Ý tưởng: Độ phức tạp. O(N·2^N) thời gian và O(2^N) bộ nhớ.