#include <iostream>
#include <vector>

int main() {
	using std::size_t;
	size_t n = 5, k = 3;
	
	std::vector<std::vector<size_t>> buses(k);
	std::vector<size_t> bus_sizes(buses.size());
	for(auto& bus_size : bus_sizes) bus_size = 3;
	for(size_t n = 0; n < buses.size(); ++n) buses[n].reserve(bus_sizes[n]);

	size_t start_person = 0;

	auto comb = [&buses, &bus_sizes, n](size_t start_person, const auto& comb) -> void {
		if(start_person == n) {
			// finished!
			std::cout << '|';
			for(size_t i = 0; i < buses.size(); ++i) {
				for(size_t j = 0; j < buses[i].size(); ++j) std::cout << buses[i][j] << ' ';
				std::cout << '|';
			}
			std::cout << '\n';
		}
		else {
			size_t bus = 0;
			for(; bus < buses.size(); ++bus) {
				if(buses[bus].size() < bus_sizes[bus]) {
					buses[bus].push_back(start_person); // place person i in bus
					comb(start_person + 1, comb);
					buses[bus].pop_back();
				}
			}
			if(bus == buses.size()) { /* more people than buses :( EXCEPTION!!!! */ }
		}
	};
		
	comb(start_person, comb);
}