Salvens

A

Aug 2nd, 2023
774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <array>
  6. #include <set>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. #define int long long
  12.  
  13. const long long INF = 1e18 + 7;
  14. const int MAXN = 1e1 + 100;
  15. const int N = 3e5 + 10;
  16. const int MOD = 1e9 + 7;
  17.  
  18. pair<int, int> dp[1 << 20];
  19.  
  20. signed main() {
  21.     ios_base::sync_with_stdio(false);
  22.     cin.tie(nullptr);
  23.     cout.tie(nullptr);
  24.  
  25.     int n, w;
  26.     cin >> n >> w;
  27.     vector<int> a(n);
  28.     for (int i = 0; i < n; ++i) {
  29.         cin >> a[i];
  30.     }
  31.  
  32.     for (int mask = 0; mask < (1 << n); ++mask) {
  33.         dp[mask] = {INF, INF};
  34.     }
  35.  
  36.     dp[0] = {0, 0};
  37.     for (int mask = 0; mask < (1 << n); ++mask) {
  38.         for (int i = 0; i < n; ++i) {
  39.             if (mask & (1 << i)) {
  40.                 continue;
  41.             }
  42.             int f, s;
  43.             if (dp[mask].second + a[i] < w) {
  44.                 f = dp[mask].first;
  45.                 s = dp[mask].second + a[i];
  46.             } else if (dp[mask].second + a[i] > w) {
  47.                 f = dp[mask].first + 1;
  48.                 s = a[i];
  49.             } else if (dp[mask].second + a[i] == w) {
  50.                 f = dp[mask].first + 1;
  51.                 s = 0;
  52.             }
  53.             dp[mask | (1 << i)] = min(dp[mask | (1 << i)], {f, s});
  54.         }
  55.     }
  56.     cout << dp[(1 << n) - 1].first + (dp[(1 << n) - 1].second? 1: 0);
  57. }
Advertisement
Add Comment
Please, Sign In to add comment