Cod sursa(job #1674894)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 4 aprilie 2016 22:16:41
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 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);
    maxm = 0;
    minm = 999999999;
    for(i = 1; i <= G; i++){
        fscanf(fin, "%d %d", &gener[i].cant, &gener[i].cost);

        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(j + gener[i].cant >= W && minm > s[j + gener[i].cant])
                    minm = s[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;
        if(j + gener[i].cant >= W && minm > s[j + gener[i].cant])
                    minm = s[j + gener[i].cant];

    }

//    maxm = 0;
//    minm = 999999999;
////    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(j + gener[i].cant >= W && minm > s[j + gener[i].cant])
//                    minm = s[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;
//        if(j + gener[i].cant >= W && minm > s[j + gener[i].cant])
//                    minm = s[j + 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;
}