Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    15

    [c] aiuto programma in c ricorsione

    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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2013
    Messaggi
    15
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.