Cod sursa(job #1721639)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 26 iunie 2016 09:57:04
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;
pair <int,int> v[1001];
int d[2][5001];
int main()
{
    FILE *fin=fopen ("energii.in","r");
    FILE *fout=fopen ("energii.out","w");
    int n,k,t,s=0;
    fscanf (fin, "%d%d", &n, &k);
    for (int i=1; i<=n; i++){
        fscanf (fin, "%d%d", &v[i].first, &v[i].second);
        s=s+v[i].first;
    }
    if (s<k){
        fprintf (fout,"-1");
        return 0;
    }
    // d[i][j] == costul maxim pe care il putem obtine selectand o submultime a primelor i elemente
    // cu suma greutatilor j
    //for (int j=0;j<=k;j++)
      //  d[1][j]=d[0][j]=1000000000;
    t=1;
    for (int i=1; i<=n; i++){
        for (int j=0; j<=k; j++){
            d[t][j] = d[1-t][j];
            if ((j>=v[i].first || (j>v[i].first && d[1-t][j-v[i].first]==d[1-t][j-v[i].first-1])) && (d[t][j]==0 || d[1-t][j-v[i].first]+v[i].second > d[t][j]))
                d[t][j] = d[1-t][j-v[i].first]+v[i].second;
            else if (j>=v[i].first && (d[t][j]==0 || d[1-t][j-v[i].first]+v[i].second > d[t][j]))
                d[t][j] = d[1-t][j-v[i].first]+v[i].second;
            //printf ("%d ",d[t][j]);
        }
        t=1-t;
        //printf ("\n");
    }
    fprintf (fout,"%d",d[1-t][k]);
    return 0;
}