Cod sursa(job #18176)

Utilizator IgnitionMihai Moraru Ignition Data 18 februarie 2007 10:21:42
Problema Ghiozdan Scor 90
Compilator c Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.03 kb
#include <stdio.h>
#include <string.h>

#define MG (75009)

int INF;
int N, G;
int c[MG], n[201];
unsigned char p[MG];

int main()
{
	int i, j, k;

	freopen("ghiozdan.in", "r", stdin);
	freopen("ghiozdan.out", "w", stdout);
	
	scanf("%d %d", &N, &G);
	for(i = 0; i < N; ++ i) {
		scanf("%d", &j);
		++ n[j];
	}

	/*
	for(i = 1; i <= 200; ++ i) if(n[i])
		printf("%d %d\n", i, n[i]);
	return 0;
	*/

	memset(&INF, 0x3f, sizeof(INF));
	memset(c, 0x3f, sizeof(c)); c[0] = 0;

	/*
	printf("%d %d %d\n", INF, c[0], c[1]);
	return 0;
	*/

	for(k = 200; k > 0; -- k) if(n[k]) {
		for(i = G-k; i >= 0; -- i) if(c[i] < INF)
			for(j = i+k; n[k] && j <= G; j += k, -- n[k]) {
				if(c[j-k]+1 < c[j]) {
					c[j] = c[j-k]+1;
					p[j] = k;
				} else break;
			}
	}

	/*
	for(i = 0; i <= G; ++ i)
		printf("%d ", c[i]); printf("\n");
	for(i = 0; i <= G; ++ i)
		printf("%d ", p[i]); printf("\n");
	return 0;
	*/

	for(i = G; i >= 0; -- i) if(c[i] < INF) {
		printf("%d %d\n", i, c[i]);
		for(j = i; j > 0; j -= p[j])
			printf("%d\n", p[j]);
		break;
	}
	return 0;
}