暴力递归->记忆搜索->动态规划
没接触之前觉得很高大上,所谓的动态规划其实就是暴力递归的优化,用空间换时间,将记忆搜索做到极致。当然,做出这个递归的优化是有难度的。
这应该算是最基础的动态规划了,M [ i ] [ j ] 表示使用 i 种货币,j 元有多少种搭配。
用一维数组也可以解决,也就是这一行跑三遍,M [ i ] [ j ] += M [ i ] [ j - a [ i ] ] ;
#include <iostream> using namespace std; int M[3][32768]; int main() { int N; int a[] = { 1,2,3 }; while (cin >> N) { for (int i = 0; i <= N; i++) M[0][i] = 1; for (int i = 1; i < 3 ; i++) { for (int j = 0; j <= N; j++) { if (j - a[i] < 0) M[i][j] = M[i - 1][j]; else M[i][j] = M[i - 1][j] + M[i][j - a[i]]; } } cout << M[2][N] << endl; } return 0; }