0
点赞
收藏
分享

微信扫一扫

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


举报

相关推荐

ZCMU—A

ZCMU—1263

ZCMU—1374

ZCMU—1306

ZCMU—1798

ZCMU—1776

ZCMU—1676

ZCMU—1309

0 条评论