Problem Description
Fibonacci numbers are well-known as follow:
Now given an integer N, please find out whether N can be represented as the sum of several Fibonacci numbers in such a way that the sum does not include any two consecutive Fibonacci numbers.
Input
Multiple test cases, the first line is an integer T (T<=10000), indicating the number of test cases.
Each test case is a line with an integer N (1<=N<=10^9).
Output
One line per case. If the answer don’t exist, output “-1” (without quotes). Otherwise, your answer should be formatted as “N=f1+f2+…+fn”. N indicates the given number and f1, f2, … , fn indicating the Fibonacci numbers in ascending order. If there are multiple ways, you can output any of them.
Sample Input
4
5
6
7
100
Sample Output
5=5
6=1+5
7=2+5
100=3+8+89
Source
“浪潮杯”山东省第七届ACM大学生程序设计竞赛
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 //一般就是定义为最大的变量 + 10,开始定义为visited[44]错了多少次,我吉吉都付不清了...... 4 long long int a,b,k,flag,f[50],fx[50],visited[50]; 5 void dfs(long long int ans){ 6 //由于只需要输出一组,所以定义一个flag变量,如果已经进行完一组,直接返回 7 if(flag) 8 return; 9 if(ans == b){ 10 flag = 1; 11 printf("%lld=",b); 12 for(int i = k - 1;i >= 0;i--){ 13 if(i == k - 1) 14 printf("%lld",fx[i]); 15 else 16 printf("+%lld",fx[i]); 17 } 18 printf("\n"); 19 return; 20 } 21 for(int i = 44;i >= 1;i--){//从大往小找,节省时间 22 //题目要求不能连续,即必须相差一个,因此!visited[i - 1] && !visited[i + 1]也必须要判断 23 if(ans + f[i] <= b && !visited[i] && !visited[i - 1] && !visited[i + 1]){ 24 visited[i] = true; 25 fx[k++] = f[i]; 26 dfs(ans + f[i]); 27 if(flag)//如果进行完一组,直接返回,不用向下递归 28 return; 29 visited[i] = false; 30 k--;//回溯 31 } 32 } 33 return; 34 } 35 int main(){ 36 f[1] = 1,f[2] = 2; 37 for(int i = 3;i <= 44;i++) 38 f[i] = f[i - 1] + f[i - 2];//先进行打表 39 while(~scanf("%lld",&a)){ 40 while(a--){ 41 memset(fx,0,sizeof(fx)); 42 memset(visited,0,sizeof(visited)); 43 scanf("%lld",&b); 44 flag = 0,k = 0; 45 dfs(0); 46 if(!flag) 47 printf("-1\n"); 48 } 49 } 50 return 0; 51 }