De acuerdo. Aquí está lo que he hecho hasta ahora. Obviamente, está mal, seguro que es una catástrofe.
He ido añadiendo y quitando cosas y ya no sé por donde cogerlo.
Como está tan mal, por eso pedía el código, no creo que el mío tenga arreglo fácil...
#include <stdio.h>
#include <math.h>
#define length(x) (sizeof(x)/sizeof(x[0]))
static int V[]={1,2,3,4},aux[]={0,0,0,0},ex[]={}; //ex: vector que contiene al ultimo elemento expandido
//aux: deberia contener los elementos del subconjunto al que se le debe aplicar la funcion suma
int factorial(int M){
int num=M;
int factor = 1;
while (num > 0){
factor = num * factor;
num--;
}
return factor;
}
int suma(){
int sum=0,j=0;
while (j<length(aux)){
sum=sum+aux[j];
j++;
}
return sum;
}
int main() {
int S=5,i=0,T=0,cont=0,j,b=0,ncomb=0,k,v;
int nc[]={0,0,0,0}; //vector que contiene el numero de combinaciones para subconjuntos de 1,2,3 y 4 elementos
for (k=1;k<=length(V);k++){
ncomb=factorial(length(V))/(factorial(k)*factorial(length(V)-k));
printf("Numero de combinaciones con %d elementos: %d\n",k,ncomb);
nc[k-1]=ncomb;
}
do{
v=length(V);
if(T>v || suma()>S){ //Nodo fracaso
aux[i]=0;
i--;
T--;
nc[k]=nc[k-1];
}
else if(suma()==S){ // nodo solución
cont++;
aux[i]=0;
i--;
T--;
nc[k]=nc[k-1];
}
if(suma()<S) //nodo problema
{
T++;
i++;
}
if(i==1 && aux[0]==V[length(V)-1]){ //Nodo solucion
printf("Nº de soluciones %d\n",cont);
b=1;
exit(1);
}
ex[i]=V[i];
for(j=0;j<i;j++){
aux[j]=V[j];
aux[i-1]=ex[i+1]++;
}
}while(b==0);
}
El árbol que había pensado sería el siguiente, pero si se os ocurre otro más fácil agradezco todo lo que me digáis:
Es el árbol de ejemplo que me he hecho para aclararme, pero el programa debe valer para cualquier vector de n enteros positivos.
Edito: No me he dado cuenta que falta la línea de 3 a 3,4 en el árbol.