Cod sursa(job #18641)

Utilizator mastermageSchneider Stefan mastermage Data 18 februarie 2007 12:52:44
Problema Ghiozdan Scor 90
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.23 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

#define maxN 20010
#define maxG 75010

int n,g,vec[maxN],din[maxG],his[maxG],viz[maxN],gmax,nmin,kviz;

void inputFunc(){
	FILE*fi=fopen("ghiozdan.in","r");
	fscanf(fi,"%d %d",&n,&g);
	for(int i=0;i<n;i++){
		fscanf(fi,"%d",vec+i);
	}
	fclose(fi);
}

void outputFunc(){
	FILE*fi=fopen("ghiozdan.out","w");
	fprintf(fi,"%d %d\n",gmax,nmin);
	for(int i=0;i<nmin;i++)fprintf(fi,"%d\n",viz[i]);
	fclose(fi);
}

void dfunc(int gm,int k){
	memset(din,0,(gm+1)*4);memset(his,0,(gm+1)*4);
	
	for(int i=0;i<n;i++){
		int c=vec[i];
		for(int j=gm-c;j>0;j--)if(din[j]){
			if(din[j]+1 < din[j+c] || !din[j+c])din[j+c]=din[j]+1,his[j+c]=j;
		}
		din[c]=1;his[c]=0;
		if(din[gm]==k)break;
	}
}

int main(){
	inputFunc();
	
	for(int i=0;i<n;i++){
		int c=vec[i];
		for(int j=g-c;j>0;j--)if(din[j]){
			if(din[j]+1 < din[j+c] || !din[j+c])din[j+c]=din[j]+1,his[j+c]=j;
		}
		din[c]=1;his[c]=0;
	}
	for(int i=g;i>=0;i--)if(din[i]){gmax=i;break;}; nmin=din[gmax];
	int co=gmax, ram=nmin;
	
	while(ram){
		if(din[his[co]]==ram-1){
			viz[kviz++]=co-his[co];
			co=his[co];ram--;
		}else{
			dfunc(his[co],ram-1);
		}
		
	}
	
	outputFunc();
	return 0;
}