fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int n, d;
  6. int a[15];
  7.  
  8. int ans;
  9. bool marked[15];
  10.  
  11. void backtrack(int i, int sum_a, int cnt) {
  12. if (i == n + 1) {
  13. ans = max(ans, cnt);
  14. return;
  15. }
  16.  
  17. // i đã có cặp rồi
  18. if (marked[i]) {
  19. backtrack(i + 1, sum_a, cnt);
  20. return;
  21. }
  22.  
  23. // i chưa bắt cặp với ai
  24.  
  25. backtrack(i + 1, sum_a, cnt); // i không bắt cặp với ai cả
  26.  
  27. for (int j = 1; j <= n; j++) { // tìm người để bắt cặp với i
  28. if (j == i) continue;
  29. if (marked[j]) continue;
  30. if (sum_a != -1 && a[i] + a[j] != sum_a) continue;
  31. marked[i] = marked[j] = true;
  32. backtrack(i + 1, a[i] + a[j], cnt + 1);
  33. marked[i] = marked[j] = false;
  34. }
  35. } // O((n - 1) * (n - 3) * (n - 5) * ...)
  36.  
  37. void do_sub1() {
  38. ans = 0;
  39. backtrack(1, -1, 0);
  40. cout << ans << '\n';
  41. }
  42.  
  43. int main() {
  44. ios::sync_with_stdio(false);
  45. cin.tie(nullptr);
  46. freopen("PAIR.INP", "r", stdin);
  47. freopen("PAIR.OUT", "w", stdout);
  48. cin >> n >> d;
  49. for (int i = 1; i <= n; i++) cin >> a[i];
  50.  
  51. if (n <= 10 && d == 0) do_sub1();
  52. }
  53.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty