Description
我们定义如下数列为菲波拉契数列:
F(1)=1
F(2)=2
F(i)=F(i−1)+F(i−2)(i>=3)
给定任意一个数,我们可以把它表示成若干互不相同的菲波拉契数之和。比如13有三种表示法
13=13
13=5+8
13=2+3+8
现在给你一个数n,请输出把它表示成若干互不相同的菲波拉契数之和有多少种表示法。
Input
第一样一个数T,表示数据组数,之后T行,每行一个数n。
T≤105
1≤n≤105
Output
输出T行,每行一个数,即n有多少种表示法。
Sample Input
6
1
2
3
4
5
13
Sample Output
1
1
2
1
2
3
由于数据比较小,因此用01背包的想法去考虑即可。可用滚动数组对内存进行优化。
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;
LL f[50];
LL dp[100005];
int main()
{
f[1]=1;
f[2]=2;
for(int i=3;i<50;i++){
f[i]=f[i-1]+f[i-2];
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<50;i++){
for(int j=100000;j-f[i]>=0;j--){
dp[j]+=dp[j-f[i]];
}
}
int t;
scanf("%d",&t);
while(t--){
LL n;
scanf("%d",&n);
printf("%lld\n",dp[n]);
}
return 0;
}