迭代加深 - 遞增數列
阿新 • • 發佈:2018-11-06
遞增數列
描述
依次給你一個遞增的數列,第一次給你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;
}