Cod sursa(job #1027859)

Utilizator caliuxSegarceanu Calin caliux Data 13 noiembrie 2013 10:24:49
Problema Energii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#define NMAX 10000000
using namespace std;

int G, W, i, j, smax;
int E[NMAX], C[NMAX], v[NMAX];

inline int min(int a, int b){
    if(a < b){
        return a;
    }
    return b;
}

int main(){
    freopen("energii.in", "r", stdin);
    freopen("energii.out", "w", stdout);
    scanf("%d%d", &G, &W);
    for(i = 1; i <= G; i++){
        scanf("%d%d", &E[i], &C[i]);
    }
    v[0] = 1; smax = 0;
    int minimum = 99999999999;
    for(i = 1; i <= G; i++){
        for(j = smax; j >= 0; j--){
            if(v[j]){
                if(v[j + E[i]] == 0){
                    v[j + E[i]] = v[j] + C[i];
                    if(j == 0){
                        v[j + E[i]]--;
                    }
                }else{
                    if(j == 0){
                        v[j + E[i]] = min(v[j + E[i]], (v[j] - 1 + C[i]));
                    }else{
                        v[j + E[i]] = min(v[j + E[i]], (v[j] + C[i]));
                    }
                }
                if(j + E[i] >= W){
                     if(v[j + E[i]] < minimum){
                        minimum = v[j + E[i]];
                    }
                }
            }
        }
        smax += E[i];
    }
    if(minimum == 99999999999){
        printf("-1\n");
    }else{
        printf("%d\n", minimum);
    }
}