随手练——HDU 1284 动态规划入门

暴力递归->记忆搜索->动态规划

没接触之前觉得很高大上,所谓的动态规划其实就是暴力递归的优化,用空间换时间,将记忆搜索做到极致。当然,做出这个递归的优化是有难度的。


这应该算是最基础的动态规划了,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;
}

猜你喜欢

转载自www.cnblogs.com/czc1999/p/10359236.html
今日推荐