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] = thứ tự đi của những người có trong tập mask sao cho đạt được giá trị pair {x, y} bé nhất
  20. // với x là số hiệu của lượt đi hiện tại, y là tổng khối lượng của những người có trong lượt đi hiện tại
  21.  
  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. dp[mask] = {INF, INF};
  30. }
  31. dp[0] = {1, 0};
  32.  
  33. for (int mask = 0; mask < (1 << n); mask++) {
  34. int x = dp[mask].first, y = dp[mask].second;
  35.  
  36. for (int i = 0; i < n; i++) {
  37. if ((mask >> i) & 1) continue;
  38. int next_mask = mask | (1 << i);
  39.  
  40. if (y + w[i] <= S) {
  41. minimize(dp[next_mask], make_pair(x, y + w[i]));
  42. }
  43. else {
  44. minimize(dp[next_mask], make_pair(x + 1, w[i]));
  45. }
  46. }
  47. }
  48.  
  49. cout << dp[(1 << n) - 1].first << '\n';
  50. }
Success #stdin #stdout 0.01s 5280KB
stdin
4 10
4 8 6 1
stdout
2