您的位置:首页 > 其它

poj 2248 DFS+剪枝

2012-03-04 20:15 246 查看
由于每个数字都是由前面的两个数字之和。并且要使这个数字链最短。那么我们可以深搜一下,假设后面的数是由前面的两个数字的和,前面的两个数是我们可以逐渐往前扫描,那么算符就是前面的两个数相加,得到后面的数,这样深搜下去,并且记录找到解后这个数据链的长度。当数据长度最短时即为所求的解,这里为了加快寻找速度,对于一些不必要搜索的我们不需要去搜索,于是就把它剪去。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define MAX 105

using namespace std;
int a[MAX],r[MAX], b[2*MAX];
int n,ans;
void init(int n)
{
int i;
ans = n;
a[0] = 1;
for(i=n; i<=n+n; i++)
b[i] = 0;
for(i=n-1; i>0; i--)
b[i]=b[i+i]+1;               //b[i]中记录着到当前数最短的距离数
}
void printf()
{
int i;
for(i=0; i<ans; i++)
printf("%d ",r[i]);
printf("%d\n",n);
}

void dfs(int l)
{
int i, k;
if(l+b[a[l]]>=ans)
return;
if(a[l]==n)
{
ans = l;
for(i=0; i<l; i++)
r[i]=a[i];
return;
}
for(i=l; i>=0; i--)
for(k=i; k>=0; k--)
{
a[l+1]=a[i]+a[k];
if(a[l+1]>a[l]&&a[l+1]<=n)
dfs(l+1);
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
init(n);
dfs(0);
printf();
}
system("pause");
return 0;
}


点击打开链接







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