题目链接:/?pid=1171
解题思路:即任意给一组数,将(1+x^a[i])展开成关于x的多项式,然后从中间找到第一个系数不为零的项,这里没有限制每个子数组的大小。
题目拓展:如果给定的数组的长度是2n,将这个数组分成两组,每一组有n个数,并且使得两组的和尽可能的小。貌似以前见过。思考出来过后会发相应的链接。
#include <>
#include<>
int c1[250008];
int c2[250008];
//多项式展开的函数,在多项式的基础上乘以(1+x^v)
void expond(int v, int sum)
{
int j;
for(j = 0; j <= sum; ++j)
{
c2[v + j] += c1[j] + c1[v + j];
}
for(j = v; j <= sum; ++j)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
void main()
{
int n;
int i,j;
int v,m;
int sum;
while(scanf("%d",&n) != EOF)
{
if(n < 0)
{
break;
}
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
c1[0] = 1;
sum = 0;
while(n--)
{
scanf("%d %d", &v,&m);
while(m--)
{
sum += v;
expond(v,sum);
}
}
for(i = sum / 2; i >= 0; --i)
{
if(c1[i] != 0)
{
break;
}
}
printf("%d %d\n", sum - i, i);
}
}