發現m不會特別大,也就是層數比較淺,所以採用迭代加深
由於xi+xj可能相同,所以開一下vis數組判斷重複
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=10009; int n,x[maxn],ceil; bool c[109]; bool dfs(int dep,int now){ if(dep>ceil)return x[ceil]==n; for(int i=now-1;i>=1;i--){ for(int j=i;j>=1;j--){//必須從i開始 if(x[i]+x[j]<=x[now-1])break; if(c[x[i]+x[j]])continue; x[now]=x[i]+x[j]; if(dfs(dep+1,now+1))return 1; } }return 0; } int main(){ while(scanf("%d",&n)!=EOF){ if(n==0)break; ceil=1; memset(x,0,sizeof(x)); memset(c,0,sizeof(c)); x[1]=1; while(!dfs(2,2))ceil++; for(int i=1;i<=ceil;i++)printf("%d ",x[i]); printf(" "); } }