Pagina 4 di 4 primaprima ... 2 3 4
Visualizzazione dei risultati da 31 a 33 su 33

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    21
    scusa per il disturbo ma il programma lo stesso stampa tutte le portate senza distinzione.. Potresti ricontrollare la codifica gentilmente?

    codice:
    #include<iostream>
    # include<cmath>
    using namespace std;
    int n,k,i;
    int portate[5];
    int binario[5]= {0, 0, 0, 0, 0}; 
    int binario_migliore[5];  
         void carica ()
        {
        	for (i=0;i<n;i++)
        	{
    		
        	cout<<"Inserire elemento vettore reale "<<i+1<<endl;
        	cin>>portate[i];
        }
    	}
    	void prossima_combinazione ()
    	{
    	int pos = - 1;
        while(pos >= 0 && portate[pos] == 1) {
            portate[pos] = 0;
            pos--;
        }
        if(pos >= 0) 
            portate[pos] = 1;
        
    }
    
    
         void somma() {
        int somma = 0;
        int min;
        for(int i=0; i<n; ++i) {
            if(binario[i] == 1){
    		
                somma += portate[i];
                if (somma>=k)
                {
                	min=somma;
                	if(somma<min)
                	somma=min;
                	binario[i]=binario_migliore[i];
    			}
                     
        }
       
        
    	}
    }
    
    
    
    
      stampa_finale()
      {
      
    std::cout << "Portate da mangiare: " << std::endl;
        for(int i=0; i<n; ++i) {
            std::cout << portate[i];
            if(binario_migliore[i] == 1) {
                std::cout << "   *";
            }
            std::cout << std::endl;
        }
    }
    	int main()
    {
    
    
    	cout<<"Inserire numero di portate P"<<endl; cin>>n;
    	cout<<"Inserire K minimo"<<endl; cin>>k;
    	carica();
    prossima_combinazione();
    somma();
    stampa_finale();
    	system("pause");
    return (0);
    }

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao, sono pieno di lavoro e quindi non riesco a controllare tutto. Ti lascio il codice che avevo scritto:

    codice:
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    
    // la dimensione dei due vettori
    // se non e' fissata a priori, cambia questa parte
    const int size = 5;
    
    // ci saranno modi migliori per fare questa
    // cosa, ma questo dovrebbe funzionare
    void prossima_combinazione(int* vettore)
    {
        int pos = size - 1;
        while(pos >= 0 && vettore[pos] == 1) {
            vettore[pos] = 0;
            pos--;
        }
        if(pos >= 0) {
            vettore[pos] = 1;
        }
    }
    
    
    void stampa_vettore(int* vettore)
    {
        for(int i=0; i<size; ++i) {
            std::cout << vettore[i] << "  ";
        }
        std::cout << std::endl;
    }
    
    
    // punto chiave: calcola la somma delle portate che corrispondono
    // a un elemento pari a 1 nel vettore binario
    int somma_portate_da_mangiare(int* portate, int* binario)
    {
        int somma = 0;
        for(int i=0; i<size; ++i) {
            if(binario[i] == 1) {
                somma += portate[i];
            }
        }
        return somma;
    }
    
    
    // copia un vettore src in un vettore dst
    void copia_vettore(int size, int* dst, int* src)
    {
        for(int i=0; i<size; ++i) {
            dst[i] = src[i];
        }
    }
    
    
    int main(int argc, char const *argv[])
    {
        int portate[] = {3, 6, 4, 11, 15};
        int soglia = 12;
        int binario[] = {0, 0, 0, 0, 0};
        int binario_migliore[] = {0, 0, 0, 0, 0};
        int somma;
        int somma_migliore = -1;
    
        // per ogni combinazione
        for(int i=0; i < pow(2, size) - 1; ++i) {
            prossima_combinazione(binario);
    
            // calcolo la somma associata alla combinazione
            somma = somma_portate_da_mangiare(portate, binario);
    
            if(somma >= soglia) {
    
                // se questa e' la nuova soluzione ottima...
                if(somma < somma_migliore || somma_migliore == -1) {
    
                    // ... la salvo...
                    somma_migliore = somma;
    
                    // ... e salvo anche il vettore che
                    // identifica la combinazione
                    copia_vettore(size, binario_migliore, binario);
                }
            }
        }
    
        // stampo i risultati trovati
        std::cout << "Combinazione ottima: ";
        stampa_vettore(binario_migliore);
        std::cout << "Somma associata alla combinazione ottima: "
                  << somma_portate_da_mangiare(portate, binario_migliore) << std::endl;
    
        // Secondo me la parte seguente non e' strettamente necessaria, comunque...
    
        std::cout << "Portate da mangiare: " << std::endl;
        for(int i=0; i<size; ++i) {
            std::cout << portate[i];
            if(binario_migliore[i] == 1) {
                std::cout << "   *";
            }
            std::cout << std::endl;
        }
    
        return 0;
    }

    Solito avviso: il codice può contenere errori, anche gravi. Se lo usi lo fai unicamente sotto la tua responsabilità.

    Ciao!

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    21
    ti ringrazio tantissimo per il tuo prezioso aiuto, non sapevo come farlo.. ora cercherò di modificarlo adattandolo meglio alla situazione.. grazie ancora!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.