Cod sursa(job #18616)

Utilizator lucibitLucian Onea lucibit Data 18 februarie 2007 12:47:42
Problema Ghiozdan Scor 30
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.44 kb
#include<stdio.h>
#define maxg 64000
#define maxn 20000
unsigned int N,G,g[maxn];
unsigned int c[2][maxg],nr[2][maxg];
int main ()
{unsigned int i,j;
 freopen("ghiozdan.in","r",stdin);
 scanf("%d %d\n",&N,&G);
 for(i=1;i<=N;i++) {scanf("%d\n",&g[i]); c[0][i]=0;  }
 unsigned int max, minnr;
 max=0; minnr=100;
 for(i=1;i<=N;i++)
  for(j=1;j<=G;j++)
  if (i%2==1)
	{c[i%2][j]=c[i%2-1][j];nr[i%2][j]=nr[i%2-1][j];
	 if(j>=g[i]) {if((g[i]+c[i%2-1][j-g[i]]<=G) &&(g[i]+c[i%2-1][j-g[i]]>=c[i%2-1][j])) {c[i%2][j]=g[i]+c[i%2-1][j-g[i]];
																if((c[i%2][j]==c[i%2-1][j]) && (nr[i%2-1][j-g[i]]+1>nr[i%2-1][j]) )	nr[i%2][j]=nr[i%2-1][j];
																else nr[i%2][j]=nr[i%2-1][j-g[i]]+1;
															  }
					  }
	 if (c[i%2][j]>max) {max=c[i%2][j]; minnr=nr[i%2][j];}
	  else if(c[i%2][j]==max && minnr>nr[i%2][j]) {minnr=nr[i%2][j];}

	 }
	else
	{c[i%2][j]=c[i%2+1][j];nr[i%2][j]=nr[i%2+1][j];
	 if(j>=g[i]) {if((g[i]+c[i%2+1][j-g[i]]<=G) &&(g[i]+c[i%2+1][j-g[i]]>=c[i%2+1][j]))
												 {c[i%2][j]=g[i]+c[i%2+1][j-g[i]];
												  if((c[i%2][j]==c[i%2+1][j]) && (nr[i%2+1][j-g[i]]+1>nr[i%2+1][j]) )	nr[i%2][j]=nr[i%2+1][j];
													else nr[i%2][j]=nr[i%2+1][j-g[i]]+1;
													}
					  }
	 if (c[i%2][j]>max) {max=c[i%2][j]; minnr=nr[i%2][j];}
	  else if(c[i%2][j]==max && minnr>nr[i%2][j]) {minnr=nr[i%2][j];}

	 }
 freopen("ghiozdan.out","w",stdout);
 printf("%d %d\n",c[N%2][G],nr[N%2][G]);

 return 0;}