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
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);
}
}
}
}
}
il punto è che ottengo una soluzione greedy del problema,ma non ottengo tutte le possibili soluzioni!!come faccio?