hdu 1171 Big Event in HDU 【母函数】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171

题意:航电计算机学院要分成软件学院和计算机学院,要分物资,计算机学院的物资不少于比软件学院的(尽可能平均的请款下)

思路:母函数做一发,基本套模板,记录一下数量和价值还有总价值即可

#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=3e6+10;
const int M=1e3+10;

int c1[N],c2[N];
//c1存每种及价值的组合数
//c2是中间量
int sum[M];//总价值
int num[M];//每种物品的数量
int val[M];//每种物品的价值

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n<=0) break;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&val[i],&num[i]);
            sum[i]=sum[i-1]+num[i]*val[i];
        }
        for(int i=0;i<=num[1];i++)//首先初始化第一个表达式
            c1[i*val[1]]=1;
        for(int i=2;i<=n;i++)//i表示得到前面表达式与第i个表达式
        {
            for(int j=0;j<=sum[i-1];j++)//前面表达式的每一项
            {
                for(int k=0;k<=num[i]*val[i];k+=val[i])//当前表达式的每一项
                {
                    c2[k+j]+=c1[j];
                }
            }
            for(int j=0;j<=sum[i];j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        int mid=sum[n]/2;
        int a,b;
        for(int i=mid;i>=0;i--)
        {
            if(c1[i]!=0)
            {
                b=i;
                break;
            }
        }
        a=sum[n]-b;
        printf("%d %d\n",a,b);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41984014/article/details/84592108
今日推荐