题目链接: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(" "); } }