Quay lại danh sách thử thách
Khó 0 đã giải Tỷ lệ chấp nhận 0%

Số Chuyến Thang Máy Tối Thiểu

Nhóm người thành số chuyến thang máy ít nhất có thể, mỗi chuyến bị giới hạn trọng lượng.

Bạn sẽ học được gì

  • Biểu diễn nhóm người bằng bitmask
  • Lưu số chuyến tốt nhất và tải chuyến cuối cho mỗi tập con
  • Xử lý không gian tìm kiếm hàm mũ một cách thông minh

Đề bài

Xem bản gốc (English)

Mỗi người phải đi đúng một lần. Bất kỳ nhóm nào cũng có thể đi cùng nhau nếu tổng trọng lượng của họ không vượt quá capacity. Có thể nhóm lại tự do; thứ tự đầu vào không quan trọng. Hãy tối thiểu hóa số chuyến đi.

Cài đặt hàm elevator_rides(weights, capacity).

Đầu vào

weights: Trọng lượng của từng người.

capacity: Tổng trọng lượng tối đa cho mỗi chuyến đi.

Đầu ra

Trả về số chuyến đi tối thiểu.

Ràng buộc

1 ≤ số người ≤ 20. 1 ≤ capacity ≤ 1.000.000.000. Mỗi trọng lượng nằm trong khoảng từ 1 đến capacity.

Ví dụ

Ví dụ 1
Đầu vào:
weights = [3, 4, 5]
capacity = 7

Kết quả mong đợi:
expected = 2
Đầu vào:
std::vector<long long> weights = {3, 4, 5};
long long capacity = 7;

Kết quả mong đợi:
long long expected = 2;
Đầu vào:
long[] weights = new long[] {3, 4, 5};
long capacity = 7;

Kết quả mong đợi:
long expected = 2;

Giải thích

Gửi 3 + 4 cùng nhau và 5 đi riêng. Tổng trọng lượng 12 không thể đi trong một chuyến với sức chứa 7.

Ví dụ 2
Đầu vào:
weights = [2, 2, 2]
capacity = 6

Kết quả mong đợi:
expected = 1
Đầu vào:
std::vector<long long> weights = {2, 2, 2};
long long capacity = 6;

Kết quả mong đợi:
long long expected = 1;
Đầu vào:
long[] weights = new long[] {2, 2, 2};
long capacity = 6;

Kết quả mong đợi:
long expected = 1;

Giải thích

Cả ba người đều đi cùng nhau được vì 2 + 2 + 2 = 6.

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

Vì số người nhỏ, hãy xét theo tập con thay vì từng chuyến riêng lẻ.

Gợi ý 2

Theo dõi cả số chuyến đã dùng lẫn độ đầy của chuyến cuối cho mỗi tập con.

Gợi ý 3

Khi hai trạng thái dùng cùng số chuyến, hãy ưu tiên trạng thái có tải hiện tại nhỏ hơn.

Độ phức tạp mong đợi

thời gian O(2^n * n), bộ nhớ phụ O(2^n)

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.