Cod sursa(job #609704)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 22 august 2011 22:26:20
Problema Problema rucsacului Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
#include<utility>
#define PER pair<int,int>
#define W first
#define P second
using namespace std;
PER A[10001],B[10001],c[10001],*a,*b,*aux;
int n,w,p,wmax,i,j,ia,ib,ic,LA,LB,LC,sol;
int main()
{
    freopen("rucsac.in","r",stdin);
    freopen("rucsac.out","w",stdout);
    a=A;b=B;
    scanf("%d%d",&n,&wmax);
    for(;n;n--)
    {
        scanf("%d%d",&w,&p);LC=0;
        for(i=0;i<=LA;i++)
        {
            if(w+a[i].W>wmax)break;
            LC++;
            c[LC]=make_pair(w+a[i].W,p+a[i].P);
        }
        LB=0;
        for(ia=1,ic=1;ia<=LA&&ic<=LC;)
        {
            if(a[ia].W<c[ic].W){b[++LB]=a[ia++];continue;}
            if(a[ia].W>c[ic].W){b[++LB]=c[ic++];continue;}
            if(a[ia].P>c[ic].P){b[++LB]=a[ia++];ic++;continue;}
            b[++LB]=c[ic++];ia++;
        }
        for(;ia<=LA;)b[++LB]=a[ia++];
        for(;ic<=LC;)b[++LB]=c[ic++];
        aux=a;a=b;b=aux;LA=LB;
    }
    for(i=1;i<=LA;i++)sol=sol>a[i].P?sol:a[i].P;
    printf("%d\n",sol);
    return 0;
}