HDU 1187 Big Event in HDU
阿新 • • 發佈:2021-08-04
題意:有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; }