Cod sursa(job #2047636)

Utilizator PredaBossPreda Andrei PredaBoss Data 25 octombrie 2017 08:19:46
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("energii.in");
ofstream fout("energii.out");
int a[5005][2005];
struct energie
{
    int c,p;
};
energie v[1005];
int main()
{int g,w,i,j,k,t,s,mn1,mn2;
fin>>g>>w;
t=INT_MAX;
s=0;
mn1=INT_MIN;
mn2=INT_MIN;
for(i=1;i<=g;i++){
    fin>>v[i].c>>v[i].p;
    if (v[i].c>w && v[i].p<t){
        t=v[i].p;
    }
    s=s+v[i].c;}
    if(s<w){
        fout<<-1;
    }
    else{
           for(i=1;i<=g;i++){
            if(v[i].p<t && v[i].c<w){
                if(v[i].c>mn1){
                    mn2=mn1;
                    mn1=v[i].c;
                }
                else{
                    if(v[i].c>mn2){
                        mn2=v[i].c;
                    }
                }
            }
           }
           if(mn1+mn2<w){
            s=w;
           }
           else{
            s=mn1+mn2;
           }
        for (i=1;i<=g;i++){
            for(j=1;j<=s;j++){
                a[i][j]=a[i-1][j];
                if(v[i].c<=w){
                    if(a[i-1][j]!=0 && (j==v[i].c || a[i][j-v[i].c]>0)){
                        a[i][j]=min(a[i-1][j],a[i-1][j-v[i].c]+v[i].p);
                    }
                    else{
                            if(a[i-1][j-v[i].c]>0){
                        a[i][j]=a[i-1][j-v[i].c]+v[i].p;
                            }
                            else{
                                if(j==v[i].c){
                                    a[i][j]=v[i].p;
                                }
                            }
                    }
                }
            }
        }


    for(i=w;i<=s;i++){
        if(a[g][i]<t && a[g][i]>0){
            t=a[g][i];
        }
    }

    fout<<t;
    }


    return 0;
}