您的位置:首页 > 其它

poj1011 深搜入门

2016-03-16 21:21 316 查看
题目意思很简单:就是要把之前掰断的棍子还原成多少根一样长的棍子就好了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int a[100];
bool used[100];
int aim,num,n;

int cmp(int x,int y){
return (x>y?1:0);
}

bool dfs(int stick,int len,int pos)
{
int i;
bool sign=(len==0?true:false);
//num是从大到小的,所以不用怕当为一根棍子的情况的
if(stick==num)
return true;

for(i=pos+1;i<n;i++){
if(used[i])
continue;

if(a[i]+len==aim){
used[i]=true;

if(dfs(stick+1,0,-1))
return true;
used[i]=false;

return false;
}
else if(len+a[i]<aim){
used[i]=true;
if(dfs(stick,len+a[i],i))
return true;
used[i]=false;
//下面的if和while都是重要减枝,否则就超时了
if(sign)
return false;
while(a[i]==a[i+1])
i++;
}
}
return false;
}

int main()
{
while(scanf("%d",&n),n)
{
int sum=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
//从大到小排序
sort(a,a+n,cmp);

for(aim=a[0];aim<=sum;aim++){
//要可以被除才会有可能复原棍子,num位原来的长度
if(sum%aim==0){
num=sum/aim;
memset(used,false,sizeof(used));

if(dfs(1,0,-1)){
printf("%d\n",aim);
break;
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: