I had the same problem, but for any n multichoose k. I also needed a non-recursive algorithm to resolve it as my performance requirements are strict. I couldn't find a non-recursive solution anywhere on the web, so I implemented one in C++ (for generic vectors) and C. See: http://github.com/ekg/multichoose, specifically multichoose.h: template <class T> std::vector< std::vector<T> > multichoose(int k, std::vector<T>& objects) { std::vector< std::vector<T> > choices; int j,j_1,q,r; r = objects.size() - 1; std::vector<T*> a, b; // combination indexes for (int i=0;i<k;i++) { a.push_back(&objects[0]); b.push_back(&objects[r]); } j=k; while(1){ std::vector<T> multiset; for(int i=0;i<k;i++) multiset.push_back(*a[i]); choices.push_back(multiset); j=k; do { j--; } while(a[j]==b[j]); if (j<0) break; j_1=j; while(j_1<=k-1){ a[j_1]=a[j_1]+1; q=j_1; while(q<k-1) { a[q+1]=a[q]; q++; } q++; j_1=q; } } return choices; }