Fibonacci and 0-1背包

Fibonacci的快速幂求法时间是O(lgn)

  1. #include<iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4. typedef unsigned long long int LINT;  
  5. //函数 Fibonacci采用快速的幂的方法可以实现快速的 Fibonacci避免了相应的计算;  
  6. //其中f0和f1是初始的条件  
  7. //n代表的是所要求的fn的下标   
  8. int Fibonacci(LINT f0,LINT f1,LINT n)  
  9. {  
  10. LINT fn;  
  11.     int n_bi=ceil(log(n+1)/log(2));  
  12. LINT *array_n_bi=new LINT[n_bi]();  
  13.     forint i=0;i<n_bi;++i)   
  14.     {  
  15.     array_n_bi[i]=n%2;  
  16.         n/=2;     
  17.     }    
  18.  LINT** matrix=new LINT*[n_bi];  
  19.     forint i=0;i<n_bi;++i)  
  20.       matrix [i]=new LINT[4]();  
  21.     matrix[0][0]=0;  
  22.     matrix[0][1]=1;  
  23.     matrix[0][2]=1;  
  24.     matrix[0][3]=1;   
  25.      forint i=1;i<n_bi;++i)  
  26.      {  
  27.         matrix[i][0]=(matrix[i-1][0]*matrix[i-1][0]+matrix[i-1][1]*matrix[i-1][2]);  
  28.         matrix[i][1]=(matrix[i-1][0]*matrix[i-1][1]+matrix[i-1][1]*matrix[i-1][3]);  
  29.         matrix[i][2]=(matrix[i-1][2]*matrix[i-1][0]+matrix[i-1][3]*matrix[i-1][2]);  
  30.         matrix[i][3]=(matrix[i-1][2]*matrix[i-1][1]+matrix[i-1][3]*matrix[i-1][3]);  
  31.      }  
  32. LINT m11=1;  
  33. LINT m12=0;  
  34. LINT m21=0;  
  35. LINT m22=1;  
  36. LINT temp_m11=1;  
  37. LINT temp_m12=0;  
  38. LINT temp_m21=0;  
  39. LINT temp_m22=1;  
  40.          forint i=0;i<n_bi;++i)  
  41.      {  
  42.         if(array_n_bi[i]==1)  
  43.         {  
  44.             m11=(temp_m11*matrix[i][0]+temp_m12*matrix[i][2]);  
  45.             m12=(temp_m11*matrix[i][1]+temp_m12*matrix[i][3]);  
  46.             m21=(temp_m21*matrix[i][0]+temp_m22*matrix[i][2]);  
  47.             m22=(temp_m21*matrix[i][1]+temp_m22*matrix[i][3]);  
  48.             temp_m11=m11;  
  49.             temp_m12=m12;  
  50.             temp_m21=m21;  
  51.             temp_m22=m22;  
  52.         }  
  53.      }  
  54.      fn=(m11*f0+m21*f1);  
  55.      cout<<fn<<endl;  
  56.      return fn;  
  57. }  
  58. int main()  
  59. {  
  60. unsigned long long int n;  
  61.     cin>>n;  
  62.     if(n<3)  
  63.     cout<<n<<endl;  
  64.      else  
  65.     {  
  66.             int res=Fibonacci(1,1,n);  
  67.     }   
  68.   
  69. }   

01背包问题(动态规划)

  1. #include<cstdio>    
  2. using namespace std;   
  3. //函数 knapsack_problem_01中  
  4. //need代表的是物品需要的空间数组   
  5. //value代表的是物品价值数组   
  6. //m代表的是背包的最大容量  
  7. //n代表的是物品的个数   
  8. int knapsack_problem_01(int *need,int* value,int m,int n)  
  9. {  
  10.       int * f=new int[m]();    
  11.     for(int i=0;i<n;++i)    
  12.         for(int j=m;j>=need[i];--j)    
  13.             if(f[j]<f[j-need[i]]+value[i])    
  14.                 f[j]=f[j-need[i]]+value[i];    
  15.                 return f[m-1];  
  16. }  
  17. int main()    
  18. {    
  19.     int n,m;    
  20.     scanf("%d%d",&n,&m);    
  21.     int *need=new int[n];    
  22.     int* value=new int[n];    
  23.     for(int i=0;i<n;++i)    
  24.        scanf("%d%d",need+i,value+i);    
  25.     
  26.     printf("%d\n",knapsack_problem_01(need,value, m,n));  
  27. }    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值