Cod sursa(job #163617)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 22 martie 2008 14:49:36
Problema Vanatoare Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 11-12 Marime 1.27 kb
#include <cstdio>

#define fin  "vanatoare.in"
#define fout "vanatoare.out"

const int Nmax = 16;

int N,T;
int a[Nmax],b[Nmax];

int dp[ ( 1 << Nmax ) ],use[ ( 1 << Nmax ) ];
int tat[ ( 1 << Nmax ) ];

void readdata()
{
	int i;
	
	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	scanf("%d%d",&N,&T);

	for ( i = 0; i < N; ++i )
	{
		scanf("%d%d",&a[i],&b[i]);
	}
}

void rec(int a)
{
	int i;

	if ( use[ a ] )
		printf("%d ",use[a]);
	else
		rec(tat[a]),rec(a ^ tat[a]);
}

void solve()
{
	int i,j,k,lim;
	
	lim = ( 1 << N );

	for ( i = 1; i < lim; ++i )
	{
		for ( k = 0; k <= T; ++k )
		{
			for ( j = 0; j < N; ++j )
				if ( ( ( 1 << j ) & i ) && ( ( k - a[j] ) % b[j] != 0 || k - a[j] < 0 ) )
					break;
			if ( j == N )
			{
				dp[i] = 1;use[i] = k;
		//		printf("%d %d\n",i,k);
				break;
			}
		}
	}

	for ( i = 1; i < lim; ++i )
	       if ( dp[i] == 0 )
	       {
		        dp[ i ] = N + 1;
			for ( j = 1; j < i; ++j )
				if ( ( ( i | j ) ^ i ) == 0 && dp[ j ] + dp[ (i ^ j) ] < dp[ i ] )
				{
					dp[ i ] = dp[ j ] + dp[ ( i ^ j ) ];
					tat[ i ] = j;
	       			}
	       }

//	for ( i = 1; i < lim; ++i )
//	       printf("%d ",dp[i]);
//	printf("\n");

	printf("%d\n",dp[ ( 1 << N ) - 1 ]);
	rec(lim-1);
	printf("\n");	
}

int main()
{
	readdata();
	solve();	
	return 0;
}