Advertisement
a53

Meet in the Middle

a53
Apr 19th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. /// Program C++ pentru a demonstra lucrul cu algoritmul Meet in the Middle pentru problema subset de suma maxima
  2. /// https://www.geeksforgeeks.org/meet-in-the-middle/
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. typedef long long int ll;
  6. ll X[2000005],Y[2000005];
  7.  
  8. /// Gaseste toate sumele posibile de elemente din a[] si le memoreaza in x[]
  9. void calcsubarray(ll a[], ll x[], int n, int c)
  10. {
  11. for (int i=0; i<(1<<n); i++)
  12. {
  13. ll s = 0;
  14. for (int j=0; j<n; j++)
  15. if (i & (1<<j))
  16. s += a[j+c];
  17. x[i] = s;
  18. }
  19. }
  20.  
  21. /// Returneaza suma maxima posibila mai mica sau egala cu S
  22. ll solveSubsetSum(ll a[], int n, ll S)
  23. {
  24. /// Se calculeaza toate sumele subsetului pentru prima si a doua jumatate
  25. calcsubarray(a, X, n/2, 0);
  26. calcsubarray(a, Y, n-n/2, n/2);
  27. int size_X = 1<<(n/2);
  28. int size_Y = 1<<(n-n/2);
  29. /// Se sorteaza Y (trebuie sa facem cautarea binara in el)
  30. sort(Y, Y+size_Y);
  31. /// Pentru a tine minte suma maxima a unui subset astfel incat suma maxima sa fie mai mica decat S
  32. ll max = 0;
  33. /// Traverseaza toate elementele lui X si face Cautare binara pentru o pereche in Y cu o suma maxima mai mica decat S.
  34. for (int i=0; i<size_X; i++)
  35. {
  36. if (X[i] <= S)
  37. {
  38. /// low_bound () intoarce prima adresa care are o valoare mai mare sau egala cu S-X [i]
  39. int p = lower_bound(Y, Y+size_Y, S-X[i]) - Y;
  40. /// Daca S-X[i] nu se afla in vectorul Y atunci micsoram p cu 1
  41. if (p == size_Y || Y[p] != (S-X[i]))
  42. p--;
  43. if ((Y[p]+X[i]) > max)
  44. max = Y[p]+X[i];
  45. }
  46. }
  47. return max;
  48. }
  49.  
  50. /// Codul functiei principale
  51. int main()
  52. {
  53. ll a[] = {45, 34, 4, 12, 5, 2};
  54. int n=sizeof(a)/sizeof(a[0]);
  55. ll S = 42;
  56. printf("Cea mai mare valoare mai mica sau egala cu valoarea data "
  57. "sum este %lld\n", solveSubsetSum(a,n,S));
  58. return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement