1. 程式人生 > 其它 >HDU 1187 Big Event in HDU

HDU 1187 Big Event in HDU

題意:有n個物品,希望儘可能均分

儘可能均分,就是找儘可能接近sum/2的方案

考慮生成函式 \(G(x)=(1+x^{v[i]}+x^{2v[i]}+...+x^{a[i]v[i]})(...\)

#include<bits/stdc++.h>

using namespace std;

int rd(){
  int ret=0, f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}

const int MAXN = 500005;

int n;

int val[MAXN],num[MAXN],sum,all;

int f[MAXN][2];

void solve(){
  sum=0;
  all=0;
  for(int i=1;i<=n;i++){
    val[i]=rd();num[i]=rd();
    sum+=val[i]*num[i];
  }
  all=sum;
  memset(f,0,sizeof(f));
  f[0][0]=1;
  for(int i=1;i<=n;i++){
    int u=i&1,v=1-(i&1);
    for(int j=0;j<=sum;j++){
      for(int k=0;k<=num[i]&&k*val[i]+j<=sum;k++){
        f[j+k*val[i]][u]+=f[j][v];
      }
    }
    for(int j=0;j<=sum;j++){
      f[j][v]=0;
    }
  }
  for(int i=sum/2;i>=0;i--){
    if(f[i][n&1]){
      cout<<all-i<<" "<<i<<endl;
      return;
    }
  }
}

int main(){
  while(~scanf("%d",&n)){
    if(n<0) return 0;
    solve();
  }
  return 0;
}

未經許可,禁止搬運。