hdu 1171 Big Event in HDU

来源:互联网 发布:cms采集电影采集 编辑:程序博客网 时间:2024/06/04 12:44

跟之前一题很类似,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;}


原创粉丝点击