• 周六. 8月 20th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

HDU 1187 Big Event in HDU

admin

11月 28, 2021

题意:有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;
}

本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/15098919.html

发表回复

您的电子邮箱地址不会被公开。