Cod sursa(job #19275)

Utilizator hellraizerChiperi Matei hellraizer Data 19 februarie 2007 09:16:40
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>

#define G 201
#define G_MAX 75001

int n,g,v[G],a[G_MAX],t[G_MAX],s[G_MAX];

void citire(){
	int i,x;
	FILE *fin=fopen("ghiozdan.in","r");
	fscanf(fin,"%d %d",&n,&g);
	for (i=1;i<=n;i++){
		fscanf(fin,"%d",&x);
		v[x]++;
	}
	fclose(fin);
}

void prelucrare(){
	int i=1,j,k;
	while (i<=G){
		if (v[i]){
			for (j=g-i;j>=0;j--)
				if (a[j])
					for (k=1;(k<=v[i])&&(j+k*i<=g);k++)
						if ((a[j+k*i]==0)||(a[j+k*i]>a[j]+k)){
							a[j+k*i]=a[j]+k;
							t[j+k*i]=j;
							s[j+k*i]=i;
						}
			for (k=1;(k<=v[i])&&(k*i<=g);k++)
				if (a[k*i]==0||a[k*i]>k){
					a[k*i]=k;
					s[k*i]=i;
				}
		}
		i++;
	}
}
	
void afisare(){
	int i,j;
	FILE *fout=fopen("ghiozdan.out","w");
	for (i=g;!a[i];i--);
	fprintf(fout,"%d %d\n",i,a[i]);
	while (t[i]!=0){
		for (j=1;j<=(i-t[i])/s[i];j++)
			fprintf(fout,"%d\n",s[i]);
		i=t[i];
	}
	for (j=1;j<=i/s[i];j++)
		fprintf(fout,"%d\n",s[i]);
	fclose(fout);
}

int main(){
	citire();
	prelucrare();
	afisare();
	return 0;
}