您的位置:首页 > 其它

poj 1011 sticks

2012-03-24 17:35 260 查看
#include<iostream>

#include<algorithm>

using namespace std;

int a[100],visit[100];

int NumSticks;

/*

我的大体思路是这样:

1.首先对于可能的长度len,首先求出总共的棍的数目num,然后对len

进行dfs,在数组里找合适的木棍填充len,填充完毕后,num数减少1,在继续在里面找,

如果在当前层次上面找不到后,那么就退出此时的查找,说明len是不可能的长度(这里要对数组

元素降序排序。。

这个可以这样写:



这里问题就是如何每一次对len的dfs,找出合适的棍子,以及如果不合适,怎么回到上一层

初始的状态,



*/

int cmp(int a,int b)

{

return a>b;

}

int dfs(int stick[],int visit[],int len,int deslen,int s,int num)

//len指的的当前匹配棍的长度,s是在数组stick[]的搜索起点,num是棍子数目

{

/*

证明次算法的正确性,首先退出条件是如果NumSticks根棍子都被dfs过了,也就是说都被填充过了,那么退出,说明此initlen

可行,,,

在里面一循环体,首先从起点s开始遍历,为什么呢,这样是按照从前往后依次尝试,如果不行,那么右从s+1.。等开始遍历

这样就考虑到了全部情况, 然后在里面的循环当中,if(len+stick[i]<deslen) 那么根据dfs,遍历下一次, 直到成功为止,而成功

就是说num==Numsticks 在这if(len+stick[i]==deslen) 那么修改len=0,s=0,这是正确的 ,然偶胡后面加上优化步骤,因为每一个else

都是一些不符合条件的dfs情况,所以可以加上优化步骤,,

*/

if(num==NumSticks)

return 1;

// visit[s]=1;

int sample=-1;

for(int i=s;i<NumSticks;i++)

{

if(visit[i]!=0||sample==stick[i])

continue;

visit[i]=1;

if(len+stick[i]<deslen)

{

if(dfs(stick,visit,len+stick[i],deslen,i,num+1))

{

return 1;

}

else

sample=stick[i];

}

else if(len+stick[i]==deslen)

{

if(dfs(stick,visit,0,deslen,0,num+1))

return 1;

else

sample=stick[i];

}

visit[i]=0;

if(len==0) //优化,这里要的

{

break;

}



}

return 0;

}

int main()

{

int flag;

int sum;

int maxlen;

while(cin>>NumSticks&&NumSticks!=0)

{

flag=0;

sum=0;

memset(visit,0,sizeof(visit));

for(int i=0;i<NumSticks;i++)

{

cin>>a[i];

sum+=a[i];

// visit[i]=0;

}

sort(a,a+NumSticks,cmp);

maxlen=a[0];

for(int initlen=maxlen;initlen<=sum/2;initlen++)

{

if(sum%initlen==0&&dfs(a,visit,0,initlen,0,0))

{

cout<<initlen<<endl;

flag=1;

break;

}

}

if(!flag)

cout<<sum<<endl;

}

return 0;

// system("pause");

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