Fibonacci的快速幂求法时间是O(lgn)
- #include<iostream>
- #include<cmath>
- using namespace std;
- typedef unsigned long long int LINT;
- //函数 Fibonacci采用快速的幂的方法可以实现快速的 Fibonacci避免了相应的计算;
- //其中f0和f1是初始的条件
- //n代表的是所要求的fn的下标
- int Fibonacci(LINT f0,LINT f1,LINT n)
- {
- LINT fn;
- int n_bi=ceil(log(n+1)/log(2));
- LINT *array_n_bi=new LINT[n_bi]();
- for( int i=0;i<n_bi;++i)
- {
- array_n_bi[i]=n%2;
- n/=2;
- }
- LINT** matrix=new LINT*[n_bi];
- for( int i=0;i<n_bi;++i)
- matrix [i]=new LINT[4]();
- matrix[0][0]=0;
- matrix[0][1]=1;
- matrix[0][2]=1;
- matrix[0][3]=1;
- for( int i=1;i<n_bi;++i)
- {
- matrix[i][0]=(matrix[i-1][0]*matrix[i-1][0]+matrix[i-1][1]*matrix[i-1][2]);
- matrix[i][1]=(matrix[i-1][0]*matrix[i-1][1]+matrix[i-1][1]*matrix[i-1][3]);
- matrix[i][2]=(matrix[i-1][2]*matrix[i-1][0]+matrix[i-1][3]*matrix[i-1][2]);
- matrix[i][3]=(matrix[i-1][2]*matrix[i-1][1]+matrix[i-1][3]*matrix[i-1][3]);
- }
- LINT m11=1;
- LINT m12=0;
- LINT m21=0;
- LINT m22=1;
- LINT temp_m11=1;
- LINT temp_m12=0;
- LINT temp_m21=0;
- LINT temp_m22=1;
- for( int i=0;i<n_bi;++i)
- {
- if(array_n_bi[i]==1)
- {
- m11=(temp_m11*matrix[i][0]+temp_m12*matrix[i][2]);
- m12=(temp_m11*matrix[i][1]+temp_m12*matrix[i][3]);
- m21=(temp_m21*matrix[i][0]+temp_m22*matrix[i][2]);
- m22=(temp_m21*matrix[i][1]+temp_m22*matrix[i][3]);
- temp_m11=m11;
- temp_m12=m12;
- temp_m21=m21;
- temp_m22=m22;
- }
- }
- fn=(m11*f0+m21*f1);
- cout<<fn<<endl;
- return fn;
- }
- int main()
- {
- unsigned long long int n;
- cin>>n;
- if(n<3)
- cout<<n<<endl;
- else
- {
- int res=Fibonacci(1,1,n);
- }
- }
01背包问题(动态规划)
- #include<cstdio>
- using namespace std;
- //函数 knapsack_problem_01中
- //need代表的是物品需要的空间数组
- //value代表的是物品价值数组
- //m代表的是背包的最大容量
- //n代表的是物品的个数
- int knapsack_problem_01(int *need,int* value,int m,int n)
- {
- int * f=new int[m]();
- for(int i=0;i<n;++i)
- for(int j=m;j>=need[i];--j)
- if(f[j]<f[j-need[i]]+value[i])
- f[j]=f[j-need[i]]+value[i];
- return f[m-1];
- }
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- int *need=new int[n];
- int* value=new int[n];
- for(int i=0;i<n;++i)
- scanf("%d%d",need+i,value+i);
- printf("%d\n",knapsack_problem_01(need,value, m,n));
- }