我好像将博客当成微博写了…………
#include <iostream>
#include <cstring>
using namespace std;
const int size = 44;
int fib[size];
int vist[size];//可以组成的数字
int sum[size];
int count =0;
void f(int n,int m){
int cnt=0;
if(n==0){
// for(int i=1;i<100;i++){
// for(int j=0;j<vist[i];j++) {
// cout<<fib[i]<<" ";
// }
// }
// cout<<endl;
count++;
return;
}
// 剪枝
if(sum[m]<n){
return;
}
for(int i=m;i>=2;i--){
if(fib[i]<=n && !vist[i]){
vist[i]=1;
f(n-fib[i],i);
vist[i]=0;
}
}
}
int main(){
//初始化
memset(fib,0,sizeof(fib));
fib[1]=fib[2]=1;
for(int i=3;i<size;i++){
fib[i]=fib[i-1]+fib[i-2];
cout<<i<<" "<<fib[i]<<endl;
}
sum[0]=0;
for(int i=1;i<size;i++){
sum[i]=sum[i-1]+fib[i];
cout<<i<<" "<<sum[i]<<endl;
}
//开始运行
int n;
while(cin>>n){
f(n,size-1);
cout<<count;
}
return 0;
}
以上就是代码
其中的剪枝过程极大的减小了算法的递归时间复杂度