A dir la verità ho provato a fare una funzione che mi trova tutte le combinazioni, ho provato e apparentemente funziona. In poche parole, come ho detto prima, sarebbe utile utilizzare un array temporaneo che contiene tutti i possibili valori combinati (almeno 2) di b. Io ho implementato una lista minimale chiamata IntLista, una struttura composta da due campi, uno contiene il numero, l'altro il puntatore al successivo. Insieme ad essa ho utilizzato delle funzioni per l'inserimento ordinato (crescente) ed una funzione che mi elimina le occorrenze, inoltre quest'ultima ritorna il nuovo numero di elementi non duplicati presenti in lista. Oltre a ciò, per calcolare tutti i possibili valori, ho utilizzato una funzione che restituisce la lista appunto con tutti i possibili valori (già ordinata e senza duplicati). Per tale funzione ho fatto uso di tre cicli for, almeno per l'algoritmo che ho pensato di utilizzare . Infatti il codice può essere scritto meglio oppure si potrebbe scegliere un algoritmo diverso, però questo mi è venuto facile a farlo. Ecco il codice:
struct IntList{
int value;
IntList* next;
};
void insList(IntList* &l,int n){
if(l==0){
l=new IntList;
l->value=n;
l->next=0;
}else{
if(l->value >= n){
IntList* p=l;
l=new IntList;
l->value=n;
l->next=p;
}else insList(l->next,n);
}
}
int removeDuplicated(IntList* &l,int n){
if (l!=0){
if(n==-1){
n=l->value;
return removeDuplicated(l->next,n) + 1;
}else{
if(l->value == n){
IntList* p=l;
l=l->next;
delete p;
return removeDuplicated(l,n);
}else return removeDuplicated(l->next,l->value)+1;
}
}else return 0;
}
IntList* compareValues(const int* vet,int n){
IntList* l=0;
int i,j,z;
int sum;
for(z=1;z<n;++z){
for(j=0;j<n-z;++j){
sum=vet[j];
for(i=j+z;i<n;++i){
sum+=vet[i];
insList(l,sum);
}
}
}
removeDuplicated(l,-1);
return l;
}
int main()
{
int a[5]={3,6,7,10,78};
int b[6]={2,6,4,3,5,5};
IntList* l=compareValues(b,6);
for(int i=0;i<5;++i){
IntList* p=l;
while(p!=0){
if(p->value==a[i]){
cout<<"\nl'elemento a["<<i<<"] è la somma dei valori di b, di valore "<<a[i];
break;
}else if(p->value > a[i]) p=0;
else p=p->next;
}
if (p==0) cout<<"\nl'elemento a["<<i<<"] NON è la somma dei valori di b, di valore "<<a[i];
}
system("PAUSE");
}
Ripeto, il codice può essere scritto meglio, ad esempio si potrebbero utilizzare le STL vector, queue, liste ordinate, ecc.