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;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/80428015