Cod sursa(job #2669967)

Utilizator Tudor06MusatTudor Tudor06 Data 8 noiembrie 2020 15:50:24
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 1e3;
const int GMAX = 1e4;

int dp[2][GMAX + 1];

struct obiect {
    int weight;
    int price;
} v[NMAX + 1];
int main() {
    ifstream fin( "energii.in" );
    ofstream fout( "energii.out" );
    int n, g, i;
    fin >> n >> g;
    for ( i = 1; i <= n; i ++ ) {
        fin >> v[i].price >> v[i].weight;
    }
    for ( i = 1; i <= GMAX; i ++ ) {
        dp[1][i] = -1;
    }
    dp[1][v[1].price] = v[i].weight;
    int x = 1;
    for ( i = 2; i <= n; i ++ ) {
        x = 1 - x;
        for ( int j = 0; j < v[i].price; j ++ ) {
            dp[x][j] = dp[1 - x][j];
        }
        for ( int j = v[i].price; j <= GMAX; j ++ ) {
            if ( dp[1 - x][j - v[i].price] == -1 )
                dp[x][j] = dp[1 - x][j];
            else if ( dp[1 - x][j] == -1 )
                dp[x][j] = dp[1 - x][j - v[i].price] + v[i].weight;
            else {
                dp[x][j] = min( dp[1 - x][j], dp[1 - x][j - v[i].price] + v[i].weight );
            }
        }
    }
    int minim = 1e9;
    for ( i = g; i <= GMAX; i ++ ) {
        if ( dp[x][i] != -1 ) {
            minim = min( minim, dp[x][i] );
        }
    }
    if ( minim == 1e9 )
        fout << -1;
    else
        fout << minim;
    return 0;
}