Pagini recente » Cod sursa (job #702458) | Cod sursa (job #987440) | Cod sursa (job #885147) | Cod sursa (job #1292913) | Cod sursa (job #163617)
Cod sursa(job #163617)
#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;
}