zoukankan      html  css  js  c++  java
  • 斐波那契数列

    问题描述

    F(0)=0,

    F(1)=1,

    F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

    算法实现

    动态规划实现:

    #include <iostream>
    using namespace std;
    
    /*
    *	动态规划?!!
    *	输入:n = 0,1,2,...
    *	输出:f(n)
    */
    long fibonacci(unsigned n)
    {
    	int result[2] = { 0, 1 };
    	if (n < 2) return result[n];
    
    	long fibNMinusOne = 1;
    	long fibNMinusTwo = 0;
    	long fibN = 0;
    	for (unsigned int i = 2; i <= n; i++)
    	{
    		fibN = fibNMinusOne + fibNMinusTwo;
    
    		fibNMinusTwo = fibNMinusOne;
    		fibNMinusOne = fibN;
    	}
    	return fibN;
    }
    
    int main()
    {
    	int a[45] = { 0 }; // 初始化
    	// 0 1 1 2 3 5 8 13 21 34 55...
    	cout << fibonacci(40) << endl; // 102334155
    	getchar();
    	return 0;
    }

    备忘录方法实现:

    #include <iostream>
    using namespace std;
    
    /*
    *	备忘录方法
    *	输入:n = 0,1,2,...
    *	输出:f(n)
    */
    long fibonacci(int a[], unsigned n)
    {
    	if (a[n] != 0) //
    	{
    		return a[n];
    	}
    	if (n == 0)
    	{
    		return 0;
    	}
    	if (n == 1)
    	{
    		return 1;
    	}
    	a[n] = fibonacci(a, n - 1) + fibonacci(a, n - 2);
    	return a[n];
    }
    
    int main()
    {
    	int a[45] = { 0 }; // 初始化
    	// 0 1 1 2 3 5 8 13 21 34 55...
    	cout << fibonacci(a, 40) << endl; // 102334155
    	getchar();
    	return 0;
    }

    其它可用动态规划求解的问题

    1. 最长公共子序列

    2. 0-1背包问题

    0-1背包问题属于0-1型整数规划问题,它可以用动态规划算法求解,也可以用回溯法或分支限界法求解,但它不能用贪心算法求解,因为无法保证最终能将背包装满,部分闲置的背包空间使每千克背包空间的价值降低了。

  • 相关阅读:
    java 运算符优先级(sum operator priority level)
    how to improve your programming ablity?
    window.returnValue = 00000000; window.close();
    list
    select card 双层
    double color ball
    Linq 左连接 内连接
    DDD 详细 介绍 摘自网络
    没有老板的公司,你适应吗?摘自网络
    Using Java Classes in your .NET Application 摘自网络
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4524406.html
Copyright © 2011-2022 走看看