POJ 2248

题目链接:http://bailian.openjudge.cn/practice/2248

题解:

迭代加深DFS。

DFS思路:从目前 $x[1 sim p]$ 中选取两个,作为一个新的值尝试放入 $x[p+1]$。

迭代加深思路:设定一个深度限制,一旦到达这个界限,即继续往下搜索;该深度限制从 $1$ 开始,每次自加 $1$。这么做的好处是,正好也符合题目要求的最短的数组长度。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,x[105];

int d;
bool dfs(int p)
{
    if(p==d) return x[p]==n;
    bool vis[105];
    memset(vis,0,sizeof(vis));
    for(int i=p;i>=1;i--)
    {
        for(int j=p;j>=i;j--)
        {
            int tp=x[i]+x[j];
            if(tp>n || x[p]>=tp) continue;
            if(!vis[tp])
            {
                x[p+1]=tp;
                if(dfs(p+1)) return 1;
                else vis[tp]=1;
            }
        }
    }
    return 0;
}

int main()
{
    x[1]=1;
    while(cin>>n && n)
    {
        for(d=1;!dfs(1);d++);
        for(int i=1;i<=d;i++) printf("%d ",x[i]);
        printf("
");
    }
}
原文地址:https://www.cnblogs.com/dilthey/p/10645971.html