// Laboratorio 5 - Esercizio 1 // Matteo Schiff - s295565 #include #include typedef struct { int start, end; } att; void readFile(att **val, int *N, char *filename) { FILE *fp; if ((fp = fopen(filename, "r")) == NULL) { printf("Impossibile aprire il file di input %s", filename); exit(1); } fscanf(fp, "%d", N); *val = (att *) malloc(*N * sizeof(att)); for (int i = 0; i < *N; i++) { fscanf(fp, "%d %d", &(*val)[i].start, &(*val)[i].end); } fclose(fp); } int controllaCompatibile(att *val, int N, int pos, int *selezioni) { int compatibile = 1; att last = val[pos]; for (int i = 0; i < N && compatibile; i++) { if (i != pos && selezioni[i] == 1) { if (val[i].start < last.end && last.start < val[i].end) compatibile = 0; } } return compatibile; } void stampaSoluzione(int *soluzione, att *val, int N) { for (int i = 0; i < N; i++) { if (soluzione[i] == 1) { printf("(%d, %d) ", val[i].start, val[i].end); } } printf("\n"); } void attSelR(int N, att *val, int pos, int *selezioni, int *soluzione, int durata, int *durata_soluzione) { // Terminazione if (pos >= N) { if (durata > *durata_soluzione) { *durata_soluzione = durata; // copio nuova soluzione for (int i = 0; i < N; i++) { soluzione[i] = selezioni[i]; } } return; } // inserisco un attività solo se è compatibile con il resto della soluzione if (controllaCompatibile(val, N, pos, selezioni)) { selezioni[pos] = 1; int d = val[pos].end - val[pos].start; attSelR(N, val, pos+1, selezioni,soluzione, durata+d, durata_soluzione); } // continuo ad esplorare senza prendere l'attività selezioni[pos] = 0; attSelR(N, val, pos+1, selezioni,soluzione, durata, durata_soluzione); return; } void attSel(int N, att *v) { int durata_soluzione = 0; int *selezioni = (int *) calloc(N, sizeof(int)); int *soluzione = (int *) calloc(N, sizeof(int)); attSelR(N, v, 0, selezioni, soluzione, 0, &durata_soluzione); printf("Migliore soluzione:\n"); stampaSoluzione(soluzione, v, N); printf("Durata della migliore soluzione: %d\n", durata_soluzione); free(selezioni); free(soluzione); } int main(int argc, char const *argv[]) { att *val; int N; readFile(&val, &N, "att.txt"); attSel(N, val); free(val); return 0; }