Cod sursa(job #18736)

Utilizator megabyteBarsan Paul megabyte Data 18 februarie 2007 13:02:32
Problema Ghiozdan Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#define INF "ghiozdan.in"
#define OUF "ghiozdan.out"
#define NMAX 8192
struct obj
{
	int gre,nr;
}a[NMAX],b[NMAX],*p,*q,*aux;
int v[NMAX];
FILE *out;
void print(int g)
{
	if(g-a[g].gre>0) print(g-a[g].gre);
	fprintf(out,"%d\n",a[g].gre);
}
int main()
{
	int i,j,n,g,nm,gm,ok;
	FILE *in;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d %d",&n,&g);
	for(i=1;i<=n;i++) fscanf(in,"%d",&v[i]);
	p=a;q=b;
	p[0].gre=1;p[0].nr=0;
	for(j=1;j<g;j++) { p[j].gre=-1;p[j].nr=(1<<24); }
	for(i=1;i<=n;i++)
	{
		//a[v[i]].gre=v[i];a[v[i]].nr=1;
		for(j=0;j<=g;j++)
		if(v[i]<=j&&p[j-v[i]].nr+1<p[j].nr)
		{
				q[j].nr=p[j-v[i]].nr+1;
				q[j].gre=v[i];
				//printf("%d ",j);
		}
	        else {q[j].nr=p[j].nr;q[j].gre=p[j].gre;}
		
		aux=p;p=q;q=aux;
	}
	//for(i=1;i<=12;i++) printf("%d %d\n",p[i].nr,p[i].gre);
	ok=0;
	for(j=g;j>0&&!ok;j--)
		if(p[j].gre>0) { gm=j;nm=p[j].nr;ok=1; }
        fprintf(out,"%d %d\n",gm,nm);
	//print(gm);
	for(i=1;i<=nm;i++)fprintf(out,"%d\n",v[i]);
	fclose(in);fclose(out);
	return 0;
}