题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171
题目大意:把一堆东西分成尽可能平均的两份,给出了物品的种类和每种的个数,套模板。。。
代码如下:
#include <stdio.h>
#include <string.h>
const int MAX=250005;
int c1[MAX],c2[MAX];
int main()
{
int n,num[55],money[55];
while(scanf("%d",&n)&&n>=0)
{
for(int i=1; i<=n; i++)
scanf("%d%d",&money[i],&num[i]);
c1[0]=1;
int max=0,max1;//max为当前c1数组里最大的指数,即最大能组合出的数
for(int i=1; i<=n; i++)//循环每个因子
{
max1=max+money[i]*num[i];//每次循环的界限控制的恰到好处
for(int j=0; j<=num[i]; j++)//每个因子的每一项,共有num[i]+1项
{
for(int k=0; k<=max; k++)//循环c1数组的每一项
c2[k+j*money[i]] += c1[k];
}
max=max1;
for(int i=0;i<=max1;i++)
c1[i]=c2[i],c2[i]=0;
}
for(int i=max1/2; i>=0; i--)
if(c1[i])
{
printf("%d %d\n",max1-i,i);
break;
}
}
return 0;
}