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!