I had the same problem, but I needed a non-recursive algorithm to resolve it as my performance requirements are strict.
I couldn't find a 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;
}