Cod sursa(job #1674884)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 4 aprilie 2016 22:07:50
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>

FILE *fin = fopen("energii.in", "r");
FILE *fout = fopen("energii.out", "w");

struct ob{
    int cant, cost;
};

ob gener[1002];

int s[10000000];

int main(){
    int G, W;
    int i, j, maxm, minm;
    fscanf(fin, "%d", &G);
    fscanf(fin, "%d", &W);
    for(i = 1; i <= G; i++){
        fscanf(fin, "%d %d", &gener[i].cant, &gener[i].cost);
    }

    maxm = 0;
//    s[0] = 1;
    for(i = 1; i <= G; i++){
        for(j = maxm; j >= 1; j--)
            if(s[j]){
                if(s[j + gener[i].cant] == 0)
                    s[j + gener[i].cant] = s[j] + gener[i].cost;
                else if(s[j + gener[i].cant] > s[j] + gener[i].cost)
                    s[j + gener[i].cant] = s[j] + gener[i].cost;
                if(maxm < j + gener[i].cant)
                    maxm = j + gener[i].cant;
            }
        if(s[gener[i].cant] == 0)
            s[gener[i].cant] = gener[i].cost;
        else if(s[gener[i].cant] > gener[i].cost)
            s[gener[i].cant] = gener[i].cost;
        if(maxm < gener[i].cant)
            maxm = gener[i].cant;
    }

//    for(i = 1; i <= 14; i++)
//        fprintf(fout, "%d ", s[i]);

    minm = 999999999;
    for(i = W; i <= maxm; i++)
        if(s[i] < minm && s[i] != 0)
            minm = s[i];

    fprintf(fout, "%d\n", minm);

    fclose(fin);
    fclose(fout);
    return 0;
}