母函数

晚上写了几道简单的母函数。

母函数万变不离其宗。。

1.HDU1171

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int value[2000], num[2000];
int c1[250010], c2[250010];
int sum = 0;

void fun(int N)
{
int cnt = num[1];
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for( int i = 0; cnt >= 0; i += value[1], cnt--)
{
c1[i] = 1;
}
for( int i = 2; i <= N; i++)
{
for( int j = 0; j <= sum; j++)
{

for(int k = 0, cnt = num[i]; k + j <= sum && cnt >= 0; k += value[i], cnt--)
{
c2[k+j] += c1[j];

}

}
for( int k = 0; k <= sum; k++)
{
c1[k] = c2[k];
c2[k] = 0;
}

}
for( int i = sum / 2 ; i <= sum; i++)
{
if( c1[i] && c1[sum - i] && i >= sum - i)
{
printf("%d %d\n", i, sum - i);
return;
}
}
}

int main( )
{
int N;
while( scanf("%d",&N) != EOF )
{
sum = 0;
if( N < 0 )
break;
memset(num, 0, sizeof(num));
memset(value, 0, sizeof(value));
for( int i = 1; i <= N; i++)
{
scanf("%d%d",&value[i],&num[i]);
sum += value[i] * num[i];
}
fun(N);
}
}

2.HDU1398

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int c1[1000], c2[1000];

void fun( )
{
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for( int i = 0; i <= 300; i++)
{
c1[i] = 1;
}
for( int i = 2; i <= 17; i++)
{
for( int j = 0; j <= 300; j++)
{
for(int k = 0; k + j <= 300; k += i * i)
{
c2[k + j] += c1[j];
}
}
for( int k = 0; k <= 300; k++)
{
c1[k] = c2[k];
c2[k] = 0;
}
}
}

int main( )
{
int N;
fun( );
while( scanf("%d",&N) != EOF )
{
printf("%d\n",c1[N]);
}
return 0;
}

3.HDU1028

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int c1[400], c2[400];

void fun(int N)
{
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for( int i = 0; i <= N; i++)
{
c1[i] = 1;
}
for( int i = 2; i <= N; i++)
{
for( int j = 0; j <= N; j++)
{
for( int k = 0; k + j <= N; k += i)
{
c2[k + j] += c1[j];
}
}
for( int k = 0; k <= N; k++)
{
c1[k] = c2[k];
c2[k] = 0;
}
}

}

int main( )
{
int N;
fun(300);
while( scanf("%d",&N) != EOF )
{
printf("%d\n",c1[N]);
}
return 0;
}

4.HDU2082

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int c1[55000], c2[55000];
int num[10000];

void fun( )
{
int sum = 0;
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for( int i = 0; i <= num[1]; i++)
c1[i] = 1;
for( int i = 2; i <= 26; i++)
{
for( int j = 0; j <= 50; j++)
for( int k = 0, cnt = num[i]; k + j <= 50, cnt >= 0; k += i, cnt--)
{
c2[k + j] += c1[j];
}
for( int k = 0; k <= 50; k++)
{
c1[k] = c2[k];
c2[k] = 0;

}

}
for( int i = 1; i <= 50; i++)
{
sum += c1[i];
}
printf("%d\n", sum);
}

int main( )
{
int N;
scanf("%d", &N);
while( N--)
{
for(int i = 1; i <= 26; i++)
{
scanf("%d",&num[i]);
}
fun( );
}
}

5。 HDU 1085

View Code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int value[10] = {0, 1, 2, 5};
int num[10];
int c1[100000];
int c2[100000];
int sum = 0;

void fun( )
{
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
for( int i = 0; i <= num[1]; i++)
{
c1[i] = 1;
}
for( int i = 2; i <= 3; i++)
{
for( int j = 0; j <= sum; j++)
{
for(int k = 0, cnt = num[i]; k + j <= sum, cnt >= 0; k += value[i],cnt-- )
{
c2[k + j] += c1[j];
}
}
for( int k = 0; k <= sum; k++)
{
c1[k] = c2[k];
c2[k] = 0;
}

}
for( int i = 1; i <= sum + 10; i++)
{
if( !c1[i] )
{
printf("%d\n",i);
return;
}
}

}
int main( )
{
while( scanf("%d%d%d",&num[1], &num[2], &num[3]) != EOF )
{
sum = 0;
if(num[1] == 0 && num[2] == 0 && num[3] == 0)
break;
sum += num[1] + num[2] * 2 + num[3] * 5;
fun( );
}
}




posted on 2012-03-06 22:53  more think, more gains  阅读(257)  评论(0编辑  收藏  举报

导航