组合 母函数 hdu 1171
熟练掌握母函数
#include<iostream>
#include<cstring>
using namespace std;
int c[260000];
int v[1000];
int m[1000];
int t[300000];
int main()
{
int max,n,x,s,sum,i,j,k;
while(cin>>n)
{
if(n<0)
break;
sum=0;
for(i=1;i<=n;i++)
{
cin>>v[i]>>m[i];
sum+=v[i]*m[i];
}
memset(c,0,sizeof(c));
memset(t,0,sizeof(t));
for(i=v[1];i<=v[1]*m[1];i+=v[1])//第一个括号系数
c[i]=1;
x=0;
max=v[1]*m[1];//系数最大值
for(i=2;i<=n;i++)//选择要合并的括号
{
s=max;
for(j=1;j<=max;j++)
if(c[j])
{
for(k=v[i];k<=v[i]*m[i];k+=v[i])
{
t[k+j]=1;
if(k+j>s)
s=k+j;
}
}
x--;
max=s;
for(x=1;x<=s;x++)
if(t[x])
c[x]=1;
}
x=sum/2;
s=v[1];
for(i=1;i<=sum;i++)
if(c[i]&&abs(i-x)<abs(s-x))
s=i;
max=sum-s;
if(max<s)
{
x=max;
max=s;
s=x;
}
cout<<max<<" "<<s<<endl;
}
return 0;
}