Fai un ciclo con numeri da 1 a 2^4-1; ad ogni iterazione, fai un and con ogni bit (da 0 a 3) e, se è acceso, somma il numero di posizione corrispondente; otterrai così tutte le combinazioni richieste; in C++:
http://ideone.com/0EXYKbcodice:int elems[]={3, 6, 21, 8}; size_t numelems=sizeof(elems)/sizeof(*elems); for(int i=1; i<(1<<numelems); i++) { int result=0; for(int j=0; j<numelems; j++) result+=(i & (1<<j))?elems[j]:0; cout<<result<<'\n'; }
(nota che, a meno che i vari numeri utilizzati non siano tutti potenze diverse dello stesso numero, non è garantito che tutte le combinazioni diano risultati diversi)