Cod sursa(job #393676)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 9 februarie 2010 20:09:15
Problema Ghiozdan Scor 42
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>

const int N = 20001;
const int G_MAX = 75001;
const int INF = 2000000000;

int g[N];
int nr_min_obj[G_MAX];
int id_obj_prec[N];
int id_ultim_obj_i[G_MAX];
int n,g_max;

void deschidere()
{
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);	
}


void citire()
{
	scanf("%d%d",&n,&g_max);
	for (int i = 1; i <= n; ++i)
		scanf("%d",&g[i]);
}

void initializare_configuratii()
{
	nr_min_obj[0] = 0;
	for (int i = 1; i <= g_max; ++i)
		nr_min_obj[i] = INF;
	id_ultim_obj_i[0] = 0;
	id_obj_prec[0] = 0;
}

void rucsac()
{
	initializare_configuratii();
	for (int id_obj = 1; id_obj <= n; ++id_obj)
		for (int i = g_max - g[id_obj]; i >= 0; --i)
			if (nr_min_obj[i] != INF)
				if (nr_min_obj[i+g[id_obj]] > nr_min_obj[i] + 1)
				{
					nr_min_obj[i+g[id_obj]] = nr_min_obj[i] + 1;
					id_ultim_obj_i[i+g[id_obj]] = id_obj;
					id_obj_prec[id_obj] = id_ultim_obj_i[i];
				}
}

void afisare_configuratie(int id_obj)
{
	if (id_obj_prec[id_obj] != 0)
		afisare_configuratie(id_obj_prec[id_obj]);
	printf ("%d\n",g[id_obj]);
}

void afisare()
{
	for (int i = g_max; i >= 0; --i)
		if (nr_min_obj [i] != INF)
		{
			printf("%d %d\n",i,nr_min_obj[i]);
			afisare_configuratie(id_ultim_obj_i[i]);
			break;
		}
}

int main()
{
	deschidere();
	citire();
	rucsac();
	afisare();
}