• 洛谷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
    ",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
    ",a[i]);
    38     }
    39     while(T--){
    40         scanf("%d",&n);
    41         printf("%d=",n);
    42         DFS(45,0,1);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    day25 初始面向对象
    JavaScript中的apply()和call()
    JavaScript中的arguments详解
    测试使用MarkDown在博客园发布博客
    《Spring实战》 1-2
    总结: 《jQuery基础教程》 5-完结
    总结: 《jQuery基础教程》 1-4章
    做个计划
    Nginx与tomcat组合的简单使用
    利用 Dijit 组件框架打造丰富的用户界面
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6035353.html
Copyright © 2020-2023  润新知