母函数 HDU-1171 Big Event in HDU

来源:互联网 发布:嘀哩嘀哩 知乎 编辑:程序博客网 时间:2024/06/06 19:38

原题:HDU-1171


设p[i]为第i个物品的value,num[i]为第i个物品的数量,那么可得母函数的一般公式




限定值可以取总值的一半,既sum/2。

用数组ans[i]保存x的i次方的系数,所以结果就是看最接近限定值的不为零的ans[i]就好啦



#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int p[100],ans[265005],num[100],temp[265005];int main(){    int n,sum;    while(cin>>n&&n>0){        sum=0;        for(int i=1;i<=n;i++){            cin>>p[i]>>num[i];            sum+=p[i]*num[i];        }        memset(ans,0,sizeof(ans));        for(int i=0;i<=num[1];i++)            ans[i*p[i]]=1;        for(int i=2;i<=n;i++){            memset(temp,0,sizeof(temp));            for(int j=0;j<=(sum+1)/2;j++)                for(int k=0;k<=num[i];k++)                    temp[j+k*p[i]]=temp[j+k*p[i]]+ans[j];            for(int j=0;j<=(sum+1)/2;j++)                ans[j]=temp[j];        }        int i;        for(i=(sum+1)/2;i>=0;i--)            if(ans[i]!=0)break;        int t=max(sum-i,i);        cout<<t<<' '<<sum-t<<endl;    }    return 0;}


原创粉丝点击