您的位置:首页 > 产品设计 > UI/UE

UESTC1133 菲波拉契数制 01背包思想

2016-07-21 00:11 471 查看
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













13

Sample Output











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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: