1. 程式人生 > >迭代加深 - 遞增數列

迭代加深 - 遞增數列

遞增數列

描述
依次給你一個遞增的數列,第一次給你1,第二次開始,每次給的數字是之前某兩次和。告訴你一個數字M,表示第n次給你的數字,求最小的n,同時打印出這n個數的數列,有多組解輸出任意

輸入
一行,只有一個整數m

輸出
第一行輸出n。第二行輸出數列,每兩個數之間有且僅有一個空格。

樣例輸入
4
樣例輸出
3
1 2 4
提示
本次是數字4。第一次1,第二次2,第三次(當前)4 。

測試點編號M 測試點編號 M
1 <=20 6 <=1000
2 <=30 7 <=2500
3 <=40 8 <=3000
4 <=50 9 <=4000
5 <=60 10 <=5000


Analysis

可能我和迭代加深不熟……完全沒有想過可以迭代加深(限制搜尋深度)
但……可能也是可想的
因為如果只是一般的搜尋,到處亂走,很可能就一直找不到答案,而且就算找到了答案也不一定是最優的
那我們就可以思考迭代加深,因為最後需要的答案就是深度嘛
然後就這樣就可以A啦

不知道考場上在想什麼,連列舉都不知道了……可能是今天開運動會,腦子跑到操場上去了,找不回來了。。。


Code

#include<bits/stdc++.h>
using namespace std;
int m,k,a[100000];
bool dfs(int dep,int now)
{ if(dep>k) return false;// if(now<<(k-dep)<m) return false; if(now>m) return false; if(now==m) return true; a[dep]=now; for(int i=dep;i>=0;--i){//就是這裡,我居然不知道可以這樣列舉。。 if(dfs(dep+1,now+a[i])) return true; } return false; } int main(){ scanf("%d",&m); int i,j; for(k=0;;k++
) if(dfs(0,1)) break; printf("%d\n",k+1); for(i=0;i<k;++i) printf("%d ",a[i]); printf("%d",m); return 0; }