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++:
codice:
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';
}
http://ideone.com/0EXYKb

(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)