Cod sursa(job #397037)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 16 februarie 2010 11:34:02
Problema Zebughil Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int n,g,sol,v[20],viz[20];

void sol2()
{
	memset(viz,0,sizeof(viz));
	int i,j,lim=(1<<n)-1,cg,ci,csol=0,min;
	while(viz[0]<n)
	{
		min=g;
		for(i=1;i<=lim;i++)
		{
			cg=g;
			for(j=0;j<n;j++)
				if(i&(1<<j))
					if(viz[j+1])
						break;
			if(j<n)
				continue;
			for(j=0;j<n;j++)
				if(i&(1<<j))
					cg-=v[j+1];
			if(cg>=0)
				if(cg<=min)
				{
					min=cg;
					ci=i;
				}
		}
		for(i=0;i<n;i++)
			if(ci&(1<<i))
			{
				viz[i+1]=1;
				viz[0]++;
			}
		csol++;
	}
	if(csol<sol)
		sol=csol;
}

int main()
{
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);
	int i,j,lim,min,cj,ci,t=3,cg;
	while(t--)
	{
		memset(viz,0,sizeof(viz));
		sol=0;
		scanf("%d%d",&n,&g);
		for(i=1;i<=n;i++)
			scanf("%d",&v[i]);
		sort(v+1,v+n+1);
		while(viz[0]<n)
		{
			for(i=n;i>=1;i--)
				if(!viz[i])
					break;
			ci=i;
			cj=0;
			viz[ci]=1;
			viz[0]++;
			min=g;
			lim=(1<<ci)-1;
			for(j=0;j<=lim;j++)
			{
				cg=g-v[i];
				for(i=0;i<ci;i++)
					if(j&(1<<i))
						if(viz[i+1])
							break;
				if(i<ci)
					continue;
				for(i=0;i<ci;i++)
					if(j&(1<<i))
						cg-=v[i+1];
				if(cg>=0)
					if(cg<=min)
					{
						min=cg;
						cj=j;
					}
			}
			sol++;
			for(j=0;j<ci;j++)
				if(cj&(1<<j))
				{
					viz[j+1]=1;
					viz[0]++;
				}
		}
		sol2();
		printf("%d\n",sol);
	}
	return 0;
}