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