#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>
 
using namespace std;

template <typename InputIt, typename OutputIt>
bool next_combination(InputIt inFirst, InputIt inLast, OutputIt outFirst, OutputIt outLast) {
	assert(distance(inFirst, inLast) >= distance(outFirst, outLast));
	
	const auto front = make_reverse_iterator(outFirst);
	const auto back = make_reverse_iterator(outLast);
	auto it = mismatch(back, front, make_reverse_iterator(inLast)).first;
	
	const auto result = it != front;

	if (result) {
		auto ub = upper_bound(inFirst, inLast, *it);

		copy(ub, next(ub, distance(back, it) + 1), next(it).base());
	}
	return result;
}

int main() {
	const vector<unsigned int> row{ 40, 40, 40, 50, 50, 60, 100 };
	vector<unsigned int> it{ row.cbegin(), next(row.cbegin(), 3) };

	do {
		copy(it.cbegin(), it.cend(), ostream_iterator<unsigned int>(cout, " "));
		cout << endl;
	} while(next_combination(row.cbegin(), row.cend(), it.begin(), it.end()));
}