fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. int n, s;
  17. int w[20];
  18.  
  19. ii dp[1 << 20]; // dp[mask] = {x, y}
  20. // x = Số lượt đi tối thiểu để đưa tất cả mọi người trong mask lên đỉnh của toà nhà
  21. // y = Tổng khối lượng hiện tại của lượt đi đang xét (lượt cuối cùng)
  22. int main() {
  23. ios::sync_with_stdio(false);
  24. cin.tie(nullptr);
  25. cin >> n >> s;
  26. for (int i = 0; i < n; i++) cin >> w[i];
  27.  
  28. for (int mask = 0; mask < (1 << n); mask++) {
  29. ii& cur = dp[mask];
  30. if (mask == 0) {
  31. cur = {1, 0};
  32. continue;
  33. }
  34. cur = {INF, INF};
  35. for (int i = 0; i < n; i++) {
  36. if (!(mask & (1 << i))) continue;
  37. int prev_mask = mask ^ (1 << i);
  38. int x = dp[prev_mask].first, y = dp[prev_mask].second;
  39. if (y + w[i] <= s) {
  40. minimize(cur, make_pair(x, y + w[i]));
  41. }
  42. else {
  43. minimize(cur, make_pair(x + 1, w[i]));
  44. }
  45. }
  46. }
  47.  
  48. cout << dp[(1 << n) - 1].first << '\n';
  49. }
Success #stdin #stdout 0.01s 5288KB
stdin
4 10
4 8 6 1
stdout
2