104 lines
2.5 KiB
C
104 lines
2.5 KiB
C
// Laboratorio 5 - Esercizio 1
|
|
// Matteo Schiff - s295565
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
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;
|
|
}
|