Cod sursa(job #3234022)

Utilizator danyy13Perhaita Daniel danyy13 Data 5 iunie 2024 22:06:49
Problema Problema rucsacului Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include <stdlib.h>

#define INPUT_FILE "rucsac.in"
#define OUTPUT_FILE "rucsac.out"
#define MAX_SIZE 5000

typedef struct {
    unsigned int greutate;
    unsigned int profit;
    int criteriu;
}OBIECT;

int compar(const void *elem1, const void *elem2) {
    const OBIECT *c1 = (const OBIECT *)elem1;
    const OBIECT *c2 = (const OBIECT *)elem2;
    return c2->criteriu - c1->criteriu;
}

void afisare(OBIECT array[], unsigned int size) {
    for(unsigned int i=0;i<size;i++) {
        printf("%d %d %d\n", array[i].greutate, array[i].profit, array[i].criteriu);
    }
}

int main() {
    FILE *in = NULL, *out = NULL;
    if((in = fopen(INPUT_FILE, "r")) == NULL) {
        fprintf(stderr, "Eroare la deschidere fisier\n");
        exit(-1);
    }
    if((out = fopen(OUTPUT_FILE, "w")) == NULL) {
        fprintf(stderr, "Eroare la deschidere fisier iesire\n");
        exit(-1);
    }

    OBIECT obiect[MAX_SIZE];
    unsigned int n = 0;
    unsigned int greutateRucsac = 0, profitMax = 0, greutateMax = 0;

    fscanf(in, "%u %u", &n, &greutateRucsac);

    for(unsigned int i=0;i<n;i++) {
        fscanf(in, "%u %u", &obiect[i].greutate, &obiect[i].profit);
        obiect[i].criteriu = obiect[i].profit - obiect[i].greutate;
    }

    qsort(obiect, n, sizeof(OBIECT), compar);

    // afisare(obiect, n);

    for(unsigned int i=0;i<n;i++) {
        greutateMax += obiect[i].greutate;
        if(greutateMax > greutateRucsac) break;
        else {
            profitMax += obiect[i].profit;
        }
    }

    fprintf(out, "%d", profitMax);

    fclose(in);
    fclose(out);
    return 0;
}