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

  • 相关阅读:
    hdu 1088 HTML解析
    hdu1171 转化01背包,组合
    Java编程优化之旅(一)一般化方法
    Java简单实现Socket非阻塞通信
    Maven安装,以及导入Intellij IDEA
    笔记本的使用技巧
    Intellij IDEA使用小技巧
    学习Spring有关知识
    学习安装IntelliJ IDEA
    C#后台调用js方法无效果,未解决。
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4524406.html
Copyright © 2011-2022 走看看