Cod sursa(job #3263145)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 13 decembrie 2024 17:02:18
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 1001, W_MAX = 5001;
int N, W;
int w[N_MAX], c[N_MAX];
int dp[W_MAX]; /// dp[i] - min cost to get weight i, for i < W
               /// dp[W] - min cost to get a weight higher than W

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

void ReadInput()
{
    cin >> N >> W;
    for(int i = 0; i < N; i++)
        cin >> w[i] >> c[i];
}

inline int mini(int& a, int b)
{
    if(a == -1)
        return b;
    return a < b ? a : b;
}

void Solve()
{
    for(int i = 1; i <= W; i++)
        dp[i] = -1;
    dp[0] = 0;

    for(int i = 0, j; i < N; i++)
        for(j = W; j >= 0; j--)
            if(dp[j] != -1)
            {
                if(j + w[i] < W)
                    dp[j + w[i]] = mini(dp[j+w[i]], dp[j] + c[i]);
                else
                    dp[W] = mini(dp[W], dp[j] + c[i]);
            }

    if(dp[W] == -1) /// unable to reach W
        cout << -1 << '\n';
    else
        cout << dp[W] << '\n';
}

int main()
{
    SetInput("energii");

    ReadInput();
    Solve();

    return 0;
}