feat: Initial commit
This commit is contained in:
103
Laboratorio 5/Esercizio 1/main.c
Normal file
103
Laboratorio 5/Esercizio 1/main.c
Normal file
@@ -0,0 +1,103 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user