Cod sursa(job #1827087)

Utilizator david.sachelarieDavid Sachelarie david.sachelarie Data 11 decembrie 2016 14:01:58
Problema Problema rucsacului Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.53 kb
#include <stdio.h>
#include <stdlib.h>
int v[5000][2];
void quickSort(int begin,int end) {
    int aux,b=begin,e=end,pivot;
    pivot=v[(begin+end)/2][0];
    while(b<=e){
        while(v[b][0]<pivot) b++;
        while(v[e][0]>pivot) e--;
        if(b<=e){
            aux=v[b][0]; v[b][0]=v[e][0]; v[e][0]=aux;
            aux=v[b][1]; v[b][1]=v[e][1]; v[e][1]=aux;
            b++; e--;
        }
    }
    if(begin<e) quickSort(begin,e);
    if(b<end) quickSort(b,end);
}
int elimin(int* pozincep,int n,int val,int* scad){
    int min=-1,i,j;
    i=*pozincep;
    while(v[i][0]==-1 && i<n)
        i++;
    if(i<n){
        *scad=v[i][1];
        min=v[i][0];
    }
    j=i;
    while(*scad<val && j<n){
        while(v[j][0]==-1 && j<n)
            j++;
        (*scad)+=v[j][1];
        min+=v[j][0];
    }
    if(*scad>=val){
        while(i<j && *scad>=val){
            if(v[i][0]!=-1 && (*scad)-v[i][1]>=val){
                scad-=v[i][1];
                min-=v[i][0];
            }
            i++;
        }
        *pozincep=j+1;
        while(i<=j){
            v[i][0]=-1;
            i++;
        }
    }
    return min;
}
int gasireMax(int n,int g){
    int greutate=0,val,min,i,nr=0,pozincep=0,pozincep2,scad;
    i=0;
    while(greutate<=g && i<n){
        nr+=v[i][0];
        greutate+=v[i][1];
        i++;
    }
    if(greutate>g){
        i--;
        nr-=v[i][0];
        greutate-=v[i][1];
    }
    while(i<n){
        greutate+=v[i][1];
        if(greutate>g){
            val=greutate-g;
            pozincep2=pozincep;
            min=elimin(&pozincep2,n,val,&scad);
            if(min<v[i][0]){
                pozincep=pozincep2;
                nr=nr+v[i][0]-min;
                greutate-=scad;
            }
            else{
                v[i][0]=-1;
                greutate-=v[i][1];
            }
        }
        i++;
    }
    return nr;
}
int main()
{
    FILE*fin,*fout;
    int n,g,i;
    fin = fopen("rucsac.in" ,"r");
    fout = fopen("rucsac.out" ,"w");
    fscanf(fin, "%d%d" ,&n,&g);
    for(i=0;i<n;i++)
        fscanf(fin, "%d%d" ,&v[i][1],&v[i][0]);
    quickSort(0,n-1);
    /*for(i=1;i<=g;i++){
        max=0;
        for(j=0;j<n;j++){
            if(v[j][0]<=i){
                if(v[j][1]+v2[i-v[j][0]]>max){
                    max=v[j][1]+v2[i-v[j][0]];
                }
            }
        }
        v2[i]=max;
    }*/
    fprintf(fout, "%d\n" ,gasireMax(n,g));
    fclose(fin);
    fclose(fout);
    return 0;
}