组合 母函数 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;
}
   
  


  
 

posted @ 2013-12-14 19:48  _一千零一夜  阅读(176)  评论(0编辑  收藏  举报