ZCMU - 1990: Fibonacci

简介: ZCMU - 1990: Fibonacci

题目链接



题目大意:判断所给的数能不能由斐波那契数组成,如果能输出任意一种组成形式(注意:组成数中不能有相邻的),不能输出-1。

解题思路:暴搜 DFS,注意:不要正方向来(1,2,3,5...)TLE,反方向即可 AC。

AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
using namespace std;
typedef long long ll;
const int maxn=45;
ll a[maxn];
int vis[maxn],num[maxn];
int n,flag,len;
void init()
{
    len=flag=0;
    mem(vis,0);
}
// sum:n -> 0
// l:记录 num[] 个数
// j:递归 for_i=j 加快速度
// nx:验证是否连续
void dfs(int sum,int l,int j,int nx)
{
    if(sum==0)
    {
        flag=1;
        len=l-1;
        return;
    }
    for(int i=j;i>=1;i--)
    {
        if(flag==1) return;
        if(sum>=a[i])
            if(!vis[i] && (l-1==0 || abs(nx-i)!=1))
            {
                vis[i]=1;
                num[l]=a[i];
                dfs(sum-a[i],l+1,i-1,i);
                vis[i]=0;
            }
    }
}
int main()
{
    a[1]=1; a[2]=2;
    for(int i=3;i<=maxn;i++)
        a[i]=a[i-1]+a[i-2];
    int T; scanf("%d",&T);
    while(T-- && ~scanf("%d",&n))
    {
            init();
            dfs(n,1,maxn,0);
            if(flag)
            {
                printf("%d=",n);
                for(int i=len;i>=1;i--)
                {
                    if(i==len)
                        printf("%d",num[i]);
                    else
                        printf("+%d",num[i]);
                }
                puts("");
            }
            else
                puts("-1");
    }
    return 0;
}
目录
相关文章
|
8月前
factorial
factorial “【5月更文挑战第21天】”
92 7
|
7月前
|
机器学习/深度学习 C语言
每日一数——使用函数求Fibonacci数
每日一数——使用函数求Fibonacci数
|
8月前
9.求斐波那契Fibonacci数列通项
9.求斐波那契Fibonacci数列通项
41 0
|
存储 Java 测试技术
Next Fibonacci Number(下一个斐波拉契数列)
Write a program that takes input of integer N, followed by N more integers. For each integer, output the next fibonacci number after it.
1248 0
|
C#
C# 4种方法计算斐波那契数列 Fibonacci
F1:  迭代法 最慢,复杂度最高 F2:  直接法   F3:  矩阵法 参考《算法之道(The Way of Algorithm)》第38页-魔鬼序列:斐波那契序列   F4:  通项公式法    由于公式中包含根号5,无法取得精确的结果,数字越大误差越大   1 using System; 2 using System.
2063 0
Fibonacci数列使用迭代器实现
Fibonacci数列,数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... class FibIterator(object): """斐波那契数列迭代器""" def __init__...
1119 0