码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P1755 斐波那契的拆分

时间:2016-11-06 16:40:23      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:iostream   put   math   nbsp   style   amp   bsp   pos   silver   

题目背景

题目描述

已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出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 斐波那契的拆分

标签:iostream   put   math   nbsp   style   amp   bsp   pos   silver   

原文地址:http://www.cnblogs.com/SilverNebula/p/6035353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!