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