Cod sursa(job #2458895)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 21 septembrie 2019 19:17:35
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 5005;

FILE *IN;

int G, W, ans, S;
int dp[2][2 * NMAX];
pair <int, int> E[NMAX];

int pos, sign;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign = 1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

inline void read(){
    Read(G); Read(W);
    for(int i = 1; i <= G; i++){
        Read(E[i].first);
        Read(E[i].second);
        S += E[i].first;
    }
}

int main(){

    IN = fopen("energii.in", "r");
    freopen("energii.out", "w", stdout);

    read();
    if(S < W){
        printf("-1");
        return 0;
    }
    for(int i = 1; i <= 2 * 5001; i++)
        dp[0][i] = 2e9, dp[1][i] = 2e9;

    ans = 2e9;
    int line = 0;
    for(int i = 1; i <= G; i++){
        for(int j = 1; j <= 5000; j++){
            if(dp[1 - line][j] != 2e9){
                if(E[i].first + j <= 5000){
                    dp[line][E[i].first + j] = min(dp[1 - line][E[i].first + j], E[i].second + dp[1 - line][j]);
                    dp[line][j] = min(dp[1 - line][j], dp[line][j]);
                } else if(E[i].first >= W) ans = min(ans, E[i].second);
                else if(E[i].first + j >= W) ans = min(ans, E[i].second + dp[1 - line][j]);
            }
        }
        dp[line][E[i].first] = min(dp[line][E[i].first], E[i].second);
        line = 1 - line;
    }

    for(int i = W; i <= 2 * 5000; i++)
        ans = min(ans, dp[1 - line][i]);
    printf("%d", ans);

    return 0;
}