• 斐波那契数列


    问题描述

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

  • 相关阅读:
    从Prism中学习设计模式之Event Aggregator 模式
    Apache的HttpClient调用Https忽略证书校验
    SaltStack安装及API开启
    Java连接WebSocket服务忽略证书校验
    SpringBoot实现WebSocket服务
    MySQL主从复制搭建
    Matlab基础知识(持续更新中)
    FIFO基础知识
    图像常识知识
    VC调试记录(持续更新中)
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4524406.html
Copyright © 2020-2023  润新知