ciao a tutti ho un problema con questo es:Una azienda di trasporti possiede degli autocarri con portata utile pari a 100 quintali.Si scriva un programma C che:
• legga da un file (il cui nome `e stato preventivamente acquisito da tastiera) le informazioni relative
ad una generica spedizione, ossia:
– il numero dei colli (prima riga del file);
– per ogni collo, il peso (in quintali); l’informazione relativa a ciascun collo occupa una riga
del file;
• trovi una sistemazione dei colli sugli autocarri, in modo che il numero di autocarri necessario
per la spedizione sia minimo, e per nessun autocarro non sia superata la portata massima; `e
inoltre richiesto che lo sbilanciamento di carico tra i vari autocarri sia minimizzato.
• visualizzi:
– il numero k di autocarri necessario;
– per ogni collo, il numero d’ordine dell’autocarro (tra 0 e k − 1) su cui va caricato;
Esempio. Si supponga che il file in ingresso abbia il seguente contenuto:
10
32
76
20
81
15
25
5
48
59
5
Allora, l’uscita del programma deve essere del tipo:
Carico distribuito su 4 autocarri.
Collocazione dei colli:
+ Autocarro 0, peso 91
- Collo n. 0, peso q.li 32
- Collo n. 8, peso q.li 59
+ Autocarro 1, peso 91
- Collo n. 1, peso q.li 76
- Collo n. 4, peso q.li 15
+ Autocarro 2, peso 93
- Collo n. 2, peso q.li 20
- Collo n. 5, peso q.li 25
- Collo n. 7, peso q.li 48
+ Autocarro 3, peso 91
- Collo n. 3, peso q.li 81
- Collo n. 6, peso q.li 5
- Collo n. 9, peso q.li 5
Sbilanciamento = 2
ecco il mio codice
il punto è che ottengo una soluzione greedy del problema,ma non ottengo tutte le possibili soluzioni!!come faccio?codice:#include <stdio.h> #include <stdlib.h> void ric(int **M,int number,int *weightpack,int *QU,int pos,int s2,int v[100]); int v[100]; int main(int argc,char *argv[]) { FILE *f; int i=0,number; int *weightpack; f=fopen(argv[1],"r"); int s=0; int s2; int **M; int *QU; fscanf(f,"%d",&number); weightpack=malloc(number*sizeof(int)); while(!feof(f)) { fscanf(f,"%d",&weightpack[i]); s=weightpack[i]+s; i++; } if((s%100)!=0) { s2=s/100+1; } else s2=s/100; M=(int**)calloc(s2,sizeof(int)); for(i=0; i<s2; i++) M[i]=(int*)calloc(number,sizeof(int)); QU=malloc(number*sizeof(int)); for(i=0; i<number; i++) { QU[i]=100; } for(i=0; i<s2; i++) { v[i]=0; } ric(M,number,weightpack,QU,0, s2,v); return 0; } void ric(int **M,int number,int *weightpack,int *QU,int pos,int s2,int v[100]) { int i,j; int M1[s2],M2[number]; if(pos==s2) { for(i=0; i<s2; i++) { printf("camion n%d\n",i); for(j=0; j<number; j++) { if(M[i][j]==1) printf(" lotto numero %d\n",j); } } for(i=0; i<number; i++) { QU[i]=M1[i]; } for(i=0; i<s2; i++) { weightpack[i]=M2[i]; } for(i=0; i<s2; i++) { v[i]=0; } for(i=0; i<s2; i++) { for(j=0; j<number; j++) { M[i][j]=0; } } return; } if(pos==0) { for(i=0; i<number; i++) { M1[i]=QU[i]; } for(i=0; i<s2; i++) { M2[i]=weightpack[i]; } } { for(i=0; i<number; i++) { if(QU[pos]-weightpack[i]>0) { if(v[i]!=1) { QU[pos]-=weightpack[i]; v[i]=1; M[pos][i]=1; ric(M,number,weightpack,QU, pos+1, s2,v); } } } } }

Rispondi quotando