| ||||||||||
| 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 | |||||||||
Re:给两组数据大家试试,看你的搜索算法是否有问题In Reply To:给两组数据大家试试,看你的搜索算法是否有问题 Posted by:hpxyz70345 at 2007-07-30 15:36:28 #include<iostream>
using namespace std;
#define N 300
int used[N],a[65],b[65],dflag[65];
int answer, num;
int judge(int i,int j,int w)
{
int flag=0;int k=i+1;//for(int r=0;r<64;r++)cout<<a[r]<<" ";cout<<'\n'<<endl<<"another";for( r=0;r<200;r++)cout<<used[r]<<" ";cout<<'\n'<<endl<<"next";
int all=0;
for(int s=0;s<num;s++)//递归的跳出条件;
{if(a[s]==0)flag++;}//因为a[k]都已经置0当所有的数字都搜索完
if((flag==num)&&(used[j-1]==answer))//(1) //且used[]最后一位(因为最后有个used[j]==answer的判断
return 1; // 该过程中j++了一次 故此处判断used[j-1]
else //(1)
{
if(used[j]==answer)//(2)
{
for(int n=0;n<=w;n++)a[dflag[n]]=0;//一次搜索完成后将该组中最小的数置0;
for( n=0;n<num;n++)dflag[n]=0;
i++;j++;k=i+1;w=0;
while(!a[i])i++;dflag[0]=i;
used[j]=a[i];//a[i]=0;//将一组中的开始数据,放入used[]中并将在a[]中的该位置0;
if(!judge(i,j,w))return 0;
else return 1;
}
else if(used[j]<answer)//(2)
{
int check;
check=answer-used[j];
for(k=dflag[w]+1;k<num;k++)//从标志位后的第一位开始搜索,选择合适的加入used[]中;
{if((a[k]<=check)&&(a[k]!=0))break;}
if(k<num)//(3)
{ dflag[++w]=k;used[j+1]=used[j]+a[k];
j++;
if(!judge(i,j,w))return 0;
else return 1;
}
else //(3)
{
if(j>0)//(4)
{
if(dflag[w]>=(num-1))//(5)
{
if(w==1)return 0;//(6)
else//(6)
{
if(a[dflag[w]]!=a[dflag[w-1]])//(7)
{
w--;int r=dflag[w];dflag[w]++;
while(((!a[dflag[w]])||(a[dflag[w]]==a[dflag[w]-1])) &&(dflag[w]<num))dflag[w]++;
//此处将dflag[w]后推,后面与其相等则跳过
used[j+1]=used[j]-a[dflag[w+1]]-a[r]+a[dflag[w]];j++;
if(!judge(i,j,w))return 0;
else return 1;
}
if(a[dflag[w]]==a[dflag[w-1]])//(7)
{
w=w-2;int r=dflag[w];dflag[w]++;
while(((!a[dflag[w]])||(a[dflag[w]]==a[dflag[w]-1])) &&(dflag[w]<num))dflag[w]++;
used[j+1]=used[j]-a[dflag[w+1]]-a[dflag[w+2]]-a[r]+a[dflag[w]];j++;
if(!judge(i,j,w))return 0;
else return 1;
}
}
}
if(dflag[w]<(num-1))//(5)
{
int t=dflag[w];dflag[w]++;//用t将dflag[w](当前位)的值存放起来
while(((!a[dflag[w]])||(a[dflag[w]]==a[dflag[w]-1]))&&dflag[w]<num)dflag[w]++;
//此处跳出是可能是正常跳出,也可能是dflag[w]==num,但都进行下面的操作,再次递归时再判断
{
used[j+1]=used[j]-a[t]+a[dflag[w]];j++;
if(!judge(i,j,w))return 0;
else return 1;
}
}
}
else if(j==0)return 0;//(4) //used[]中装入的第一个数就无法满足条件
}
}
}
}
int main()
{for(int s=0;s<100;s++)
{
int i,j,temp;
int maxlen,alllen;
maxlen=0;alllen=0;
cout<<"input the number of sticks"<<endl;
cin>>num;if(num==0)return 0;
{ for(i=0;i<65;i++)
{a[i]=0;b[i]=0;dflag[i]=0;}
cout<<"input the value of sticks"<<endl;
for(i=0;i<num;i++)
{cin>>b[i];if(b[i]==0)return 0;}
for(i=0;i<num;i++)
for(j=0;j<num;j++)
if(b[j]<b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;}
for(i=0;i<num;i++)
{alllen+=b[i];}
for(int answer_wait=b[0];answer_wait<=alllen;answer_wait++)
{ if(alllen%answer_wait==0)
{
answer=answer_wait;//cout<<answer<<"is answer"<<endl;
for(i=0;i<num;i++){a[i]=b[i];}//cout<<"b[0] is"<<b[0]<<endl;cout<<"a[0] is"<<a[0]<<endl;
for(i=0;i<N;i++){used[i]=0;}used[0]=a[0];
for(i=0;i<num;i++)dflag[i]=0;
if(judge(0,0,0)){cout<<answer<<endl;break;}
}
}
}
}
return 0;
}
//本人就只用了一个递归的函数,所有的操作(包括判断和长度相加)都在这个递归函数中进行
//读起来有些烦琐,这个程序一直没有过,但是所有BT的数据包括自己搭配的数据也都过了
//算法想了好多遍也没有什么问题,A不掉也无所谓了,反正得到了应该得到的
//附上几组数据大家试试
//12
//40 40 40 40 39 38 37 36 8 7 6 5
//答案84
//16
//40 40 40 39 38 37 36 20 20 7 6 6 4 1 1 1
//答案84
//64
//40 40 30 35 35 26 15 40 40 40 40 40 40 40 40 40 40 40 40 40 40
//40 40 43 42 42 41 10 4 40 40 40 40 40 40 40 40 40 40 40 40 40
//40 25 39 46 40 10 4 40 40 37 18 17 16 15 40 40 40 40 40 40 40
//40
//答案454
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator