Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
超长的不过代码 郁闷…… 大家帮忙看看哪错了#include <iostream> using namespace std; long bPos[21],bNeg[21],w[21],pos[4000],neg[4000],nPos[4000],nNeg[4000],markPos[4000],nMarkPos[4000],markNeg[4000],nMarkNeg[4000]; int main() { //freopen("p.txt","r",stdin); //freopen("s.txt","w",stdout); long b,c,g,i,j,k,bPosNum,bNegNum,tmp,posTail,nPosTail,negTail,nNegTail; while(cin>>c>>g) { bNegNum=0; bPosNum=0; for(i=1;i<=c;i++)//输入挂钩的位置 { cin>>b; if(b<0) bNeg[++bNegNum]=b;//小于0的放到数组bNeg中 else bPos[++bPosNum]=b;//大于等于0的放到数组bPos中 } for(i=1;i<=g;i++) cin>>w[i];//输入砝码的重量 memset(pos,0,sizeof(pos));//初始化位置标量 memset(neg,0,sizeof(neg)); pos[0]=1;//为了让第一组数据找到切入点 neg[0]=1; markNeg[0]=0;//位置标量的下标初始化 markPos[0]=0; negTail=0;//下标末尾位置初始化 posTail=0; for(i=1;i<g;i++)//循环g-1件砝码 { nPosTail=-1;//初始化 下一个砝码放的时候 记录有值位置的数组 的末尾 nNegTail=-1; memset(nPos,0,sizeof(nPos));//初始化 下一个砝码放的时候 标记可达数目的数组 memset(nNeg,0,sizeof(nNeg)); for(j=1;j<=bNegNum;j++)//循环所有为负的挂钩 { tmp=-bNeg[j]*w[i];//得到相应的值 for(k=0;k<=negTail;k++)//找所有小于0的位置 if(neg[markNeg[k]])//如果这个位置有值 { if(nNeg[markNeg[k]+tmp]==0) nMarkNeg[++nNegTail]=markNeg[k]+tmp;//放砝码后的值没有被填充过,就将这个值放到标记下标的数组 nNeg[markNeg[k]+tmp]+=neg[markNeg[k]];//加上这种方法增加的可达数 } for(k=0;k<=posTail;k++)//所有大于0的位置 if(pos[markPos[k]])//如果这个位置有值 { if(markPos[k]-tmp>=0)//没有跨越0 { if(nPos[markPos[k]-tmp]==0) nMarkPos[++nPosTail]=markPos[k]-tmp;//放砝码后的值没有被填充过,就将这个值放到标记下标的数组 nPos[markPos[k]-tmp]+=pos[markPos[k]];//加上这种方法增加的可达数 } else//跨越了0 { if(nNeg[tmp-markPos[k]]==0) nMarkNeg[++nNegTail]=tmp-markPos[k]; nNeg[tmp-markPos[k]]+=pos[markPos[k]]; } } } for(j=1;j<=bPosNum;j++)//所有为正的挂钩 { tmp=bPos[j]*w[i]; for(k=0;k<=negTail;k++) if(neg[markNeg[k]]) { if(tmp-markNeg[k]<=0) { if(nNeg[markNeg[k]-tmp]==0) nMarkNeg[++nNegTail]=markNeg[k]-tmp; nNeg[markNeg[k]-tmp]+=neg[markNeg[k]]; } else { if(nPos[tmp-markNeg[k]]==0) nMarkPos[++nPosTail]=tmp-markNeg[k]; nPos[tmp-markNeg[k]]+=neg[markNeg[k]]; } } for(k=1;k<=posTail;k++) if(pos[markPos[k]]) { if(nPos[markPos[k]+tmp]==0) nMarkPos[++nPosTail]=markPos[k]+tmp; nPos[markPos[k]+tmp]+=pos[markPos[k]]; } } negTail=nNegTail; posTail=nPosTail; if(nMarkNeg[0]!=0) nMarkPos[0]=nMarkNeg[0]; else if(nMarkPos[0]!=0) nMarkNeg[0]=nMarkPos[0]; for(j=0;j<=negTail;j++) markNeg[j]=nMarkNeg[j]; for(j=0;j<=posTail;j++) markPos[j]=nMarkPos[j]; memset(neg,0,sizeof(neg)); memset(pos,0,sizeof(pos)); for(j=0;j<=negTail;j++) neg[markNeg[j]]=nNeg[markNeg[j]]; for(j=0;j<=posTail;j++) pos[markPos[j]]=nPos[markPos[j]]; } int ans=0; for(j=1;j<=bNegNum;j++) { tmp=bNeg[j]*w[g]; ans+=pos[-tmp]; } for(j=1;j<=bPosNum;j++) { tmp=bPos[j]*w[g]; ans+=neg[tmp]; } cout<<ans<<endl; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator