Cod sursa(job #652569)

Utilizator luckyme91wiz kid luckyme91 Data 25 decembrie 2011 03:45:27
Problema Energii Scor 5
Compilator c Status done
Runda Arhiva de probleme Marime 1.79 kb
/* 
 * File:   main.c
 * Author: mihai
 *
 * Created on December 25, 2011, 12:57 AM
 */

#include <stdio.h>
#include <stdlib.h>
#define min(a, b) (a) < (b) ? (a) : (b)

/*
 * 
 */
int main(int argc, char** argv) {
    freopen("energii.in", "r", stdin);
    freopen("energii.out", "w", stdout);

    int w, g, i, j, l;
    scanf("%d %d", &g, &w);
    int *a[2], *din[2];
    a[0] = (int*) calloc(g, sizeof (int));
    a[1] = (int*) calloc(g, sizeof (int));
    din[0] = (int*) calloc(w + 1, sizeof (int));
    din[1] = (int*) calloc(w + 1, sizeof (int));
    for (i = 0; i < g; i++)
        scanf("%d %d", &a[0][i], &a[1][i]);
    l = 0;
    for (i = 0; i < g; ++i, l = 1 - l)
        for (j = 1; j <= w; j++) {

            if (j >= a[0][i]) {
                if (din[l][j - a[0][i]] != 0 && din[l][j] != 0)
                    din[1 - l][j] = min(din[l][j], din[l][j - a[0][i]] + a[1][i]);
                else {
                    if (din[l][j - a[0][i]] == 0 && din[l][j] == 0) {
                        if (a[0][i] == j)
                            din[1 - l][j] = a[1][i];
                    } else {
                        if (din[l][j - a[0][i]] != 0)
                            din[1 - l][j] = din[l][j - a[0][i]] + a[1][i];
                        else {
                            if (a[0][i] != j)
                                din[1 - l][j] = din[l][j];
                            else
                                din[1 - l][j] = min(din[l][j], a[1][i]);
                        }
                    }
                    //if (din[l][j - a[0][i]] == 0)
                }
            } else
                din[1 - l][j] = din[l][j];
        }
    if (din[l][w])
    printf("%d", din[l][w]);
    else
        printf("-1");


    return 0;
}