杭电1171(HDU1171)

题意:现在我们都知道电脑学院是HDU最大的部门。但是,也许你不知道2002年计算机学院曾经被分解成电脑学院和软件学院。
分裂绝对是HDU中的一件大事!同时这也是麻烦的事情。所有的设施必须放在一半。首先,对所有设施进行评估,如果两个设施具有相同的价值,则认为两个设施是相同的。假设有N(0 <N <1000)种设施(不同值,不同种类)。
输入
输入包含多个测试用例。每个测试用例从N(0 <N <= 50 - 不同设施的总数)开始。接下来的N行每个都包含整数V(0 <V <= 50 - 设施价值)和整数M(0 <M <= - 相应的设施数)。你可以假设所有V都是不同的。
以负整数开头的测试用例终止输入,而不测试该测试用例。
产量
对于每个案例,打印一行包含两个整数A和B,分别表示计算机学院和软件学院的价值。 A和B应尽可能相同。同时,你应该保证A不小于B.
样品输入
2
10 1
20 1
3
10 1
20 2
30 1
-1
样品输出
20 10

40 40


一看就是一个简单的母函数模板题,代码如下

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long c1[250010],c2[250010];
long long a[55],b[55];
int main()
{
    int n;
    long long i,j,k,s,sum;
    while(scanf("%d",&n)!=EOF)
    {
        if(n<0)//一定要记得判断n是否小于0,结束条件不一定是n==-1的时候,这里被坑了好多发,wa的莫名其妙,比较别的代码之后才发现这个坑点。
            break;
        s=0;
        for(i=1;i<=n;i++)
        {
            scanf("%lld%lld",&a[i],&b[i]);
            s=s+a[i]*b[i];
        }
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(i=0;i<=a[1]*b[1];i=i+a[1])
            c1[i]=1;
        for(i=2;i<=n;i++)
        {
            for(j=0;j<=s;j++)
                for(k=0;j+k<=s&&k<=a[i]*b[i];k=k+a[i])
                c2[j+k]=c2[j+k]+c1[j];
            for(j=0;j<=s;j++)
            {
                c1[j]=c2[j];
                c2[j]=0;
            }
        }
        sum=s/2;
        for(i=sum;i>=0;i--)
            if(c1[i]!=0&&c1[s-i]!=0)
            break;
        printf("%lld %lld\n",s-i,i);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37751662/article/details/76129553