Cod sursa(job #3173619)

Utilizator adrian_zahariaZaharia Adrian adrian_zaharia Data 23 noiembrie 2023 13:23:39
Problema Energii Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;
const int nax=1000005;
const int mod=1e9+7;
const int inf=INT_MAX;

int n;
int G,W;
int e,c;
struct gen{
    int e,c;
};
int dp[nax];
int exists[nax];
int main(){
    freopen("energii.in","r",stdin);
    freopen("energii.out","w",stdout);

    long long suma=0;
    scanf("%d %d",&G,&W);
    vector <gen> g;
    for(int i=1;i<=G;i++){
        scanf("%d %d",&e,&c);
        g.push_back({.e=e,.c=c});
        suma+=e;
    }
    if(suma<W){
        printf("-1");
        return 0;
    }
    exists[0]=true;

//    for(int i=1;i<=G;i++){
//        printf("%d %d\n",g[i].e,g[i].c);
//    }

    for(int i=0;i<G;i++){
        for(int q=suma;q>=g[i].e;q--){
            if(exists[q-g[i].e]){
                if(exists[q]){
                    dp[q]=min(dp[q],dp[q-g[i].e]+g[i].e);
                }else{
                    dp[q]=dp[q-g[i].e]+g[i].c;
                    exists[q]=true;
                }
            }
        }
    }
    int ans=inf;
    for(int i=W;i<=suma;i++){
        if(dp[i]) ans=min(ans,dp[i]);
//        printf("%d ",dp[i]);
    }
    printf("%d",ans);

    return 0;
}