fork download
  1. #include <utility>
  2. #include <cstddef>
  3. #include <vector>
  4.  
  5. using std::size_t;
  6.  
  7. template<typename Lambda>
  8. void for_each_multiset_combo( std::vector<size_t> const& counts, Lambda&& lambda )
  9. {
  10. if (counts.empty())
  11. {
  12. lambda(counts);
  13. return;
  14. }
  15. std::vector<size_t> indexes;
  16. indexes.reserve( counts.size() );
  17. while(true) {
  18. while (indexes.size() < counts.size()) {
  19. indexes.push_back(0);
  20. }
  21. lambda( indexes );
  22. indexes.back()++;
  23. while (indexes.back() > counts[indexes.size()-1]) {
  24. indexes.pop_back();
  25. if (indexes.empty())
  26. return; // finished
  27. indexes.back()++;
  28. }
  29. }
  30. }
  31. #include <iostream>
  32.  
  33. int main() {
  34. std::vector<size_t> multiset = {3, 2, 1, 1};
  35. size_t counter = 0;
  36. for_each_multiset_combo( multiset, [&]( std::vector<size_t> const& counts ){
  37. std::cout << counter << ": [";
  38. for(auto it = counts.begin(); it != counts.end(); ++it) {
  39. if (it != counts.begin()) {
  40. std::cout << ", ";
  41. }
  42. std::cout << *it;
  43. }
  44. std::cout << "]\n";
  45. ++counter;
  46. });
  47. }
Success #stdin #stdout 0s 2984KB
stdin
Standard input is empty
stdout
0: [0, 0, 0, 0]
1: [0, 0, 0, 1]
2: [0, 0, 1, 0]
3: [0, 0, 1, 1]
4: [0, 1, 0, 0]
5: [0, 1, 0, 1]
6: [0, 1, 1, 0]
7: [0, 1, 1, 1]
8: [0, 2, 0, 0]
9: [0, 2, 0, 1]
10: [0, 2, 1, 0]
11: [0, 2, 1, 1]
12: [1, 0, 0, 0]
13: [1, 0, 0, 1]
14: [1, 0, 1, 0]
15: [1, 0, 1, 1]
16: [1, 1, 0, 0]
17: [1, 1, 0, 1]
18: [1, 1, 1, 0]
19: [1, 1, 1, 1]
20: [1, 2, 0, 0]
21: [1, 2, 0, 1]
22: [1, 2, 1, 0]
23: [1, 2, 1, 1]
24: [2, 0, 0, 0]
25: [2, 0, 0, 1]
26: [2, 0, 1, 0]
27: [2, 0, 1, 1]
28: [2, 1, 0, 0]
29: [2, 1, 0, 1]
30: [2, 1, 1, 0]
31: [2, 1, 1, 1]
32: [2, 2, 0, 0]
33: [2, 2, 0, 1]
34: [2, 2, 1, 0]
35: [2, 2, 1, 1]
36: [3, 0, 0, 0]
37: [3, 0, 0, 1]
38: [3, 0, 1, 0]
39: [3, 0, 1, 1]
40: [3, 1, 0, 0]
41: [3, 1, 0, 1]
42: [3, 1, 1, 0]
43: [3, 1, 1, 1]
44: [3, 2, 0, 0]
45: [3, 2, 0, 1]
46: [3, 2, 1, 0]
47: [3, 2, 1, 1]