Cod sursa(job #2966988)

Utilizator Luka77Anastase Luca George Luka77 Data 18 ianuarie 2023 20:48:26
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

/// INPUT / OUTPUT
ifstream fin("energii.in");
ofstream fout("energii.out");

/// GLOBAL VARIABLES
const int GMAX = 1005, WMAX = 5005, INF = 1e9;
int g, w, maxi;
int G[GMAX], W[GMAX];
int dp1[WMAX], dp2[WMAX];

inline void debug()
{
    for(int i = 1; i <= g; ++ i)
    {
        for(int j = 1; j <= max(maxi,w); ++ j)
        {
            //cout << dp[i][j] << ' ';
        }
        //cout << '\n';
    }
    //cout << '\n';
}

/// SOLUTION (I HOPE)
inline void solution()
{
    for(int j = 0; j <= max(maxi, w) + 5; ++ j)
    {
        dp2[j] = INF;
        dp1[j] = INF;
    }
    for(int i = 1; i <= g; ++ i)
    {
        for(int j = 1; j <= max(maxi, w); ++ j)
        {
            dp2[j] = dp1[j];
        }
        dp1[G[i]] = min(dp2[G[i]], W[i]);
        for(int j = max(maxi, w); j >= 1; -- j)
        {
            //cout << dp[i][j] << ' ';
            if(j - G[i] >= 1 && (dp2[j]!=INF || dp2[j-G[i]]!=INF))
            {
                //cout << "DA";
                dp1[j] = min({dp2[j], dp2[j-G[i]] + W[i], dp1[j+1]});
            }
            else
            {
                dp1[j] = min({dp2[j], dp1[j], dp1[j+1]});
            }
        }
        //cout << '\n';
    }

    //debug();

    if(dp1[w] != INF)
        fout << dp1[w];
    else
        fout << -1;
}

/// READING THE INPUT
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);
    fin >> g >> w;
    for(int i = 1; i <= g; ++ i)
    {
        fin >> G[i] >> W[i];
        maxi = max(G[i], maxi);
    }
    solution();
}