洛谷P1755 斐波那契的拆分

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1755 斐波那契的拆分相关的知识,希望对你有一定的参考价值。

题目背景

题目描述

已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法

输入输出格式

输入格式:

一个数t,表示有t组数据

接下来t行,每行一个数n(如题)

输出格式:

t行,每行一个字符串,表示拆分方法(格式:n=a1+a2+a3+..+an),要求从小到大输出

输入输出样例

输入样例#1:
input1:1
       1
input2:1 10
输出样例#1:
output1:1=1
output2:10=2+8

说明

若有多组数据,以个数最小的为准,若仍有多组,输出右边尽量大的一组

对于100%的数据 t<=1000 1<=n<=10^9

 

小小DFS

 1 /*By SilverN*/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #define LL long long
 8 using namespace std;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}
12     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
13     return x*f;
14 }
15 int T;
16 int n;
17 int a[50];
18 bool DFS(int pos,int res,bool flag){
19     if(res==n){return 1;}
20     if(!pos)return 0;
21     for(int i=pos;i;i--){
22         if(res+a[i]>n)continue;
23         if(DFS(i-1,res+a[i],0)){
24             if(flag)printf("%d\n",a[i]);
25             else printf("%d+",a[i]);
26             return 1;
27         }
28     }
29     return 0;
30 }
31 int main(){
32     int i,j;
33     scanf("%d",&T);
34     a[1]=1;a[2]=1;
35     for(i=3;i<46;i++){
36         a[i]=a[i-1]+a[i-2];
37 //        printf("%d\n",a[i]);
38     }
39     while(T--){
40         scanf("%d",&n);
41         printf("%d=",n);
42         DFS(45,0,1);
43     }
44     return 0;
45 }

 

以上是关于洛谷P1755 斐波那契的拆分的主要内容,如果未能解决你的问题,请参考以下文章

1355 斐波那契的最小公倍数

nefu 115 斐波那契的整除

这个递归斐波那契的大 O 时间复杂度?

51nod 1355 斐波那契的最小公倍数

1 斐波那契的兔子

用于求解斐波那契的 Java 8 Lambda 表达式(非递归方式)