您的位置:首页 > 其它

hdu 1171 Big Event in HDU

2013-02-16 20:28 274 查看
跟之前一题很类似,elem[ ]和num[  ] 都由输入给出,可以先求出总价值sum。 再由中间sum/2往两边找,若i和sum-i都有方案数,则为所求。输入后进行其它数组的赋值运算,居然会改变elem[0]的值,真是百思不得其解。

AC代码:

#include<iostream>
using namespace std;
const int iNum=250005;
int c1[iNum],c2[iNum];
int elem[55],num[55];
int main()
{
int n,i,j,k,sum;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
while (cin>>n){
if(n<0)
break;
sum=0;
for (i=0;i<=iNum;i++){//c1保存第1个括号,c2总是保存一趟运算的结果(每一对括号合并成一个括号)
c1[i]=0;
c2[i]=0;
}
for(i=0;i<n;i++){
cin>>elem[i]>>num[i];
sum=sum+elem[i]*num[i];
}
for (i=0;i<=num[0];i++)//此题elem[0]元硬币只有a[0]个
c1[i*elem[0]]=1;
for (i=1;i<n;i++){//n个括号要进行n-1趟运算
for (j=0;j<=sum;j++)//j是第一个括号的指数,虽然第1趟时j<=a[0],但其它趟可能超过,故上限为sum
for (k=0;k*elem[i]+j<=sum&&k<=num[i];k++){//k是第i种硬币的个数,k*elem[i]才是第二个括号的指数
c2[j+k*elem[i]]+=c1[j];//第二个括号的系数都是1,隐含了c2[j+k]+=c1[j]*1;
}
for (j=0;j<=sum;j++){//c1保存第1个括号,要保存成前一趟运算的结果
c1[j]=c2[j];
c2[j]=0;
}
}
for(i=sum/2;i>=0;i--){
if(c1[i]!=0&&c1[sum-i]!=0){
printf("%d %d\n",sum-i,i);
break;
}

}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU