fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <sstream>
  4. #include <cassert>
  5.  
  6. void Rec(std::vector<int>& arr, int k, int start, int depth, std::vector<int>& indices) {
  7. int n = arr.size();
  8. if (depth == k) {
  9. int sum = 0;
  10. for (int idx : indices) {
  11. sum += arr[idx];
  12. }
  13. if (sum == 0) {
  14. for (int idx : indices) {
  15. std::cout << idx << " ";
  16. }
  17. std::cout << std::endl;
  18. }
  19. return;
  20. }
  21. for (int i = start; i < n; ++i) {
  22. indices.push_back(i);
  23. Rec(arr, k, i + 1, depth + 1, indices);
  24. indices.pop_back();
  25. }
  26. }
  27.  
  28. void findSubarrays(std::vector<int>& arr, int k) {
  29. std::vector<int> indices;
  30. Rec(arr, k, 0, 0, indices);
  31. }
  32.  
  33. std::string captureOutput(std::vector<int> arr, int k) {
  34. std::ostringstream buffer;
  35. std::streambuf* prevcoutbuf = std::cout.rdbuf(buffer.rdbuf());
  36. //buffer — строковый поток, куда будет направляться вывод вместо std::cout.
  37. //prevcoutbuf сохраняет стандартный поток вывода, чтобы потом его вернуть.
  38. findSubarrays(arr, k);
  39. std::cout.rdbuf(prevcoutbuf);
  40. return buffer.str();
  41. }
  42.  
  43. void runTests() {
  44. // Все нули
  45. {
  46. std::vector<int> arr = {0, 0, 0};
  47. int k = 2;
  48. std::string output = captureOutput(arr, k);
  49. assert(!output.empty() && "Test 1 failed");
  50. }
  51.  
  52. // Нет подмножеств с суммой 0
  53. {
  54. std::vector<int> arr = {1, 2, 3};
  55. int k = 2;
  56. std::string output = captureOutput(arr, k);
  57. assert(output.empty() && "Test 2 failed");
  58. }
  59.  
  60. // Есть подмножество с суммой 0
  61. {
  62. std::vector<int> arr = {1, -1, 2, -2};
  63. int k = 2;
  64. std::string output = captureOutput(arr, k);
  65. assert(!output.empty() && "Test 3 failed");
  66. }
  67.  
  68. // Один элемент 0
  69. {
  70. std::vector<int> arr = {0};
  71. int k = 1;
  72. std::string output = captureOutput(arr, k);
  73. assert(!output.empty() && "Test 4 failed");
  74. }
  75.  
  76. // Большие значения
  77. {
  78. std::vector<int> arr = {1000000, -1000000, 500000, -500000};
  79. int k = 2;
  80. std::string output = captureOutput(arr, k);
  81. assert(!output.empty() && "Test 5 failed");
  82. }
  83.  
  84. // Пустой массив
  85. {
  86. std::vector<int> arr = {};
  87. int k = 1;
  88. std::string output = captureOutput(arr, k);
  89. assert(output.empty() && "Test 6 failed");
  90. }
  91.  
  92. // k больше, чем размер массива
  93. {
  94. std::vector<int> arr = {1, -1};
  95. int k = 3;
  96. std::string output = captureOutput(arr, k);
  97. assert(output.empty() && "Test 7 failed");
  98. }
  99.  
  100. std::cout << "All tests passed!\n";
  101. }
  102.  
  103. int main() {
  104. runTests();
  105.  
  106. int n, k;
  107. std::cin >> n;
  108. std::cin >> k;
  109.  
  110. std::vector<int> arr(n);
  111. for (int i = 0; i < n; ++i) {
  112. std::cin >> arr[i];
  113. }
  114. findSubarrays(arr, k);
  115. }
  116.  
Success #stdin #stdout 0.01s 5288KB
stdin
6
6
1
2
3
4
5
-15
stdout
All tests passed!
0 1 2 3 4 5