Cod sursa(job #1713848)

Utilizator giotoPopescu Ioan gioto Data 6 iunie 2016 19:28:32
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int Mini,i,n,g,c[1001],w[1001];
int d[2][10001];
int main()
{
    freopen("energii.in", "r", stdin);
    freopen("energii.out", "w", stdout);
    scanf("%d%d", &n, &g);
    int Max=g;Mini=1000000000;
    for(i=1;i<=n;++i){
        scanf("%d%d", &w[i],&c[i]),Max=max(Max,w[i]);
        Mini=min(Mini,w[i]);
    }
    int l=0;
    for(int cw=Mini;cw<=Max;++cw)
        d[0][cw]=d[1][cw]=1000000000;
    for(i=1;i<=n;++i,l=1-l){
        for(int cw=0;cw<=Max;++cw){
            d[1-l][cw]=d[l][cw];
            if(w[i]<=cw){
                if(d[1-l][cw]==1000000000&&cw-w[i]>=0){
                    if(d[1-l][cw-w[i]]==1000000000)
                        d[1-l][cw]=c[i];
                    else d[1-l][cw]=d[1-l][cw-w[i]]+c[i];
                }
                else d[1-l][cw]=min(d[1-l][cw],d[1-l][cw-w[i]]+c[i]);
            }
        }
    }
    if(Max>g){
        int  Min=1000000000;
        for(i=g;i<=Max;++i)
            Min=min(d[1][g],Min);
        printf("%d", Min);
    }
    else
        printf("%d", d[1][g]);
    return 0;
}