Cod sursa(job #1663218)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 25 martie 2016 17:32:09
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#define MAXN 100
int mat[MAXN+1][MAXN+1][MAXN+1],n,A[MAXN+1],B[MAXN+1],l;
int lin,col,z,nextl[MAXN+1][MAXN+1][MAXN+1],nextc[MAXN+1][MAXN+1][MAXN+1],vl[MAXN+1],vc[MAXN+1];
inline int cauta(int rez){
    int i,j,i1,j1,flag=0,x;
    for(i=0;i<=l;i++)
        for(j=0;j<=l;j++)
          for(x=0;x<=l;x++)
             mat[i][j][x]=0;
    mat[0][0][0]=1;
    for(i=1;i<=n;i++){
        j=0;
        while(A[i]*j<=rez){
            x=(rez-A[i]*j)/B[i];
            for(i1=0;i1<=l;i1++)
              for(j1=0;j1<=l;j1++){
                  if(i1+j<=l&&j1+x<=l){
                     if(mat[i-1][i1][j1]>0){
                        mat[i][i1+j][j1+x]+=mat[i-1][i1][j1];
                        nextl[i][i1+j][j1+x]=i1;
                        nextc[i][i1+j][j1+x]=j1;
                     }
                  }
                  else
                      if(mat[i-1][i1][j1]>0&&i1+j>=l&&j1+x>=l){
                            flag=1;
                            vl[i]=j;
                            vc[i]=x;
                            lin=i1;
                            col=j1;
                            z=i-1;
                      }
              }
            j++;
        }
    }
    return flag;
}
int main(){
    FILE*fi,*fout;
    int pas,rez,i,auxl,auxc;
    fi=fopen("lapte.in" ,"r");
    fout=fopen("lapte.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&l);
    for(i=1;i<=n;i++)
        fscanf(fi,"%d%d" ,&A[i],&B[i]);
    rez=0;
    for(pas=1<<10;pas;pas>>=1)
        if(cauta(rez+pas)==0)
           rez+=pas;
    fprintf(fout,"%d\n" ,rez+1);
    cauta(rez+1);
    while(z>0){
        vl[z]=lin-nextl[z][lin][col];
        vc[z]=col-nextc[z][lin][col];
        auxl=lin;
        auxc=col;
        lin=nextl[z][auxl][auxc];
        col=nextc[z][auxl][auxc];
        z--;
    }
    for(i=1;i<=n;i++)
        fprintf(fout,"%d %d\n" ,vl[i],vc[i]);
    fclose(fi);
    fclose(fout);
    return 0;
}