【题目】
【分析】
算法标签:迭代加深
就是枚举每一层,然后在每一层判断是否合法
然后剪枝之类的也是比较常规的操作,这里就不细说了
我记得我好像做过类似的题。。。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 105
using namespace std;
int m,h,rec[N];
bool dfs(int x,int dep)
{
if(dep>h) return false;
if(x<<(h-dep)<m) return false;
if(x>m) return false;
if(x==m) return true;
rec[dep]=x;
for(int i=dep;i>=0;--i)
if(dfs(x+rec[i],dep+1))
return true;
return false;
}
int main()
{
// freopen("sequence.in","r",stdin);
// freopen("sequence.out","w",stdout);
scanf("%d",&m);
for(h=0;;h++)
if(dfs(1,0))
break;
printf("%d\n",h+1);
for(int i=0;i<h;++i)
printf("%d ",rec[i]);
printf("%d",m);
// fclose(stdin);
// fclose(stdout);
return 0;
}