Cod sursa(job #18364)

Utilizator points_hunterAdrian Dobrescu points_hunter Data 18 februarie 2007 11:46:01
Problema Reguli Scor 0
Compilator c Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.19 kb
#include<stdio.h>
int g,n,gmax,max,nmin,i,j,ga,a[20001],v[75001],t[75001],sol[20001];
void scrie(int i)
{
 if(i==0)
   return;
 sol[t[i]]=1;
 scrie(i-a[t[i]]);
}

int main()
{
 freopen("ghiozdan.in","r",stdin);
 freopen("ghiozdan.out","w",stdout);
 scanf("%d%d",&n,&g);
 for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
 a[0]=0;
 v[0]=1;
 max=0;
 for(i=1;i<=n;i++)
     {
      ga=0;
      for(j=max;j>=0;j--)
       if(((v[j]+1<v[j+a[i]] &&v[j+a[i]]!=0)||!v[j+a[i]])&&v[j])
         {
          if(j+a[i]<=g)
            {
             if(ga==0&&j>0)
               {
                ga=1;
                int k;
                v[j+a[i]]=v[j]+1;
                t[j+a[i]]=i;
                for(k=1;k<=i;k++)
                   sol[k]=0;
                scrie(j+a[i]);
               }
             v[j+a[i]]=v[j]+1;
             t[j+a[i]]=i;
            }
          if(j+a[i]>g)
            max=g;
          else
            if(j+a[i]>max)
              max=j+a[i];
         }
      }
 for(i=g;i>=1;i--)
    if(v[i])
      {
       printf("%d %d\n",i,v[i]-1);
       break;
      }
 for(j=1;j<=i;j++)
    if(sol[j])
      printf("%d\n",a[j]);

 return 0;
}