Cod sursa(job #18330)

Utilizator AlxCojocaru Alexandru Alx Data 18 februarie 2007 11:32:55
Problema Ghiozdan Scor 48
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 0.73 kb
#include <stdio.h>
#include <string.h>
using namespace std;
int a[20100],b[75100],c[75100],n,g,gmax,ult[75100];
int main()
{
 freopen("ghiozdan.in","r",stdin);
 freopen("ghiozdan.out","w",stdout);
 scanf("%d %d\n",&n,&g);
 int i;
 for (i=0;i<n;i++)
  scanf("%d\n",&a[i]);
 c[a[0]]=b[a[0]]=1;
 ult[0]=-1;
 ult[a[0]]=0;
 gmax=a[0];
 int j;
 for (i=1;i<n;i++)
 {
  c[a[i]]=1;
  ult[a[i]]=i;
  for (j=1;j<=g-a[i];j++)
   if (b[j]&&(c[j+a[i]]>b[j]+1||c[j+a[i]]==0))
   {
    c[j+a[i]]=b[j]+1;
    ult[j+a[i]]=i;
    if (j+a[i]>gmax)
     gmax=j+a[i];
   }
  memcpy(b,c,(g+1)*sizeof(int));
 }
 printf("%d %d\n",gmax,b[gmax]);
 while (ult[gmax]>-1)
 {
  printf("%d\n",a[ult[gmax]]);
  gmax-=a[ult[gmax]];
 }
 return 0;
}