Cod sursa(job #2047656)

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

using namespace std;
ifstream fin("energii.in");
ofstream fout("energii.out");
int a[1005][10005];
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].c<w){
                if(v[i].c>mn1){
                    mn2=mn1;
                    mn1=v[i].c;}
                    else{
                        if(v[i].c>mn2){
                            mn2=v[i].c;
                        }
                    }
                }
            }
s=mn1+mn2;
        if(s<w){
            s=0;
            for(i=1;i<=g;i++){
                if(v[i].c<=w){
                    s=s+v[i].c;
                }
            }}
    if(s>=w){
        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-1][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;
}