题意:现在我们都知道电脑学院是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
分裂绝对是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; }