题目大意:给出一个数字n,要求输出符合公式要求的最短的答案(对于第k个数,必需由前k-1个数选择其中两个进行相加得到,这两个数可以是同一个数,第一个数以给,为1)
解题思路:按最大策略求出最短的迭代次数,如果在当前迭代次数下,没有找到答案,就将迭代次数加1,再进行迭代,直到找到答案
剪枝1:如果前面的数的和不大于当前数的和,或者大于n,就没必要进行迭代了,因为存放答案是按升序排列的,如果符合的话,前面就会有记录
剪枝2:符合1的要求了,得到的数如果按最大策略进行迭代,即下一个数是前一个数的两倍,如果按最大策略迭代完了,还是小于n的话,那么该数就不符合,继续寻找下一个数
#include<cstdio>
bool flag;
int ans[100];
int deep,n;
//cur当前迭代的次数,ans中确定的下标的最大值,deep表示要迭代的次数,也表示要确定的下标的最大值
void dfs(int cur, int deep) {
if(cur == deep) {
if(ans[cur] == n)
flag = true;
return ;
}
for(int i = 0; i <= cur; i++)
for(