Cod sursa(job #18881)

Utilizator gigi_becaliGigi Becali gigi_becali Data 18 februarie 2007 14:41:56
Problema Ghiozdan Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <string>
#define maxn 20001
#define maxS 75001
#define oo 0x3f3f3f3f
#include <algorithm>
using namespace std;
int main()
{
	
int G, n, x[maxn], dp[maxS], nr[maxS], pi[maxS], i, j;

freopen("ghiozdan.in", "r", stdin);
freopen("ghiozdan.out", "w", stdout);
scanf("%d %d\n", &n, &G);
	for(i=1;i<=n;i++)  scanf("%d\n", &x[i]);
	memset(dp, 0, sizeof(dp));
	memset(nr, oo, sizeof(nr));
	memset(pi, 0, sizeof(pi));
	
	sort(x+1, x+n+1);
	reverse(x+1, x+n+1);
	dp[0]=1;
	nr[0]=0;
	
	for(i=1;i<=n;++i)
		for(j=G;j>=x[i];--j)
			if(dp[j-x[i]])
				if(nr[j-x[i]]+1<nr[j])
			{
				//printf("%d  \n", j);
				dp[j]=1;
				nr[j]=nr[j-x[i]]+1;
				pi[j]=x[i];
//				break;
			}
			
	
	int poz=0, Nr=0;
	for(i=G;i>=0;i--)
		if(dp[i]) { poz=i; break;}
	

	for(i=poz;i>0;i-=pi[i]) Nr++, dp[i]=2;
	printf("%d %d\n", poz, Nr);
	for(i=G;i>=0;i--) 
		if(dp[i]==2)
		printf("%d\n", pi[i]);
	return 0;
}