Cod sursa(job #1277023)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 27 noiembrie 2014 02:03:43
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <algorithm>
FILE *fin, *fout;
int n, k, *v1, *v2, sum, temp;
struct generator
{
       int energie;
       int cost;
} *input;
int max(int a, int b)
{
    return (a > b)?a:b;
}
int main()
{
    fin = fopen("energii.in", "r");
    fout = fopen("energii.out", "w");
    fscanf(fin, "%d%d", &n, &k);
    input = new generator[n+3];
    for(int i = 0; i< n; i++)
    {
            fscanf(fin, "%d%d", &input[i+1].energie, &input[i+1].cost);
            sum+=input[i+1].cost;
    }
    v1 = new int[sum+3];
    v2 = new int[sum+3];
    for(int i = 0; i<= sum; i++) v1[i] = 0;
    v2[0] = 0;
    for(int i = 1; i<= n; i++)
    {
            for(int j = 1; j<=sum; j++)
            {
                    if(input[i].cost > j) {v2[j] = v1[j];continue;}
                    v2[j] = max(v1[j], v1[j- input[i].cost] + input[i].energie);
            }
            for(int j = 1; j<=sum; j++) v1[j] = v2[j];
    }
    temp = (v1[std::lower_bound(v1+1, v1+sum+1, k) - v1] == k)?std::lower_bound(v1+1, v1+sum+1, k) - v1:std::lower_bound(v1+1, v1+sum+1, k) - v1+1;
    fprintf(fout, "%d\n", temp);
    fclose(fin);
    fclose(fout);
    return 0;
}