# CSES Elevator Rides | Đi thang máy Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này. Author : Lê Việt Tín ## Spoiler Alert ### Approch 1 (brute-force) - Duyệt bằng cách phân nhóm bằng backtracking (đệ quy) #### Ý tưởng - Thử từng người, xem có thể đưa họ vào nhóm hiện tại không - Nếu nhóm đầy, bắt đầu một nhóm mới - Tìm phương án ít lượt nhất --- Code ```C++ //#pragma GCC optimize("O2") #include <bits/stdc++.h> #define int long long using namespace std; int n, x; vector<int> w; int best = LLONG_MAX; void backtrack(int i, vector<int> &rides, vector<int> &weight) { if (i == n) { best = min(best, (int)rides.size()); return; } // thêm người thứ i vào chuyến đã có for (int j = 0; j < rides.size(); j++) { if (weight[j] + w[i] <= x) { weight[j] += w[i]; backtrack(i + 1, rides, weight); weight[j] -= w[i]; // đệ quy } } // Mở chuyến mới rides.push_back(i); weight.push_back(w[i]); backtrack(i + 1, rides, weight); rides.pop_back(); weight.pop_back(); } signed main() { cin >> n >> x; w.resize(n); for (int &wi : w) cin >> wi; vector<int> rides, weight; backtrack(0, rides, weight); cout << best; return 0;} ``` Độ phức tạp $O(2^n)$ ### Approch 2 Tối ưu với Bitmask DP #### Ý tưởng: - Sử dụng Bitmask DP để lưu trạng thái tốt nhất khi xét tập hợp con của người - `dp[mask] = {số chuyến ít nhất, trọng lượng chuyến cuối cùng}.` ```C++ //#pragma GCC optimize("O2") #include <bits/stdc++.h> #define int long long using namespace std; int n, x; vector<int> w; pair<int, int> dp[1 << 20]; signed main() { cin >> n>>x;w.resize(n); for (int i = 0; i < n; i++) cin >> w[i]; dp[0] = {1, 0}; for (int mask = 1; mask < (1 << n); mask++) { dp[mask] = {n + 1, 0}; for (int i = 0; i < n; i++) { if (mask & (1 << i)) { int prev = mask ^ (1 << i); auto [rides, we] = dp[prev]; if (we + w[i] <= x) dp[mask] = min(dp[mask], {rides, we + w[i]}); else dp[mask] = min(dp[mask], {rides + 1, w[i]}); } } } cout << dp[(1 << n) - 1].first; return 0; } ``` Độ phức tạp : $O(n*2^n)$ Question : bài này có thể giải theo cách nào khác không ?