数据结构和算法分享专题程序员数据结构和算法分析

找零钱

2017-08-28  本文已影响232人  郑明明

给定一个数组,数组中为不同的数代表不同钱的面值,同时给定一个需要兑换零钱的钱数,任意使用不同面值不同数量的钱来兑换,求一共有多少种方法

解法一:
int operation1(vector<int> A, int index, int aim) {
    int result = 0;
    if (index == A.size()) {
        result = aim == 0 ? 1 : 0;
    } else {
        for (int i = 0; i * A[index] <= aim; i++) {
            result += operation1(A, index + 1, aim - A[index] * i);
        }
    }
    return result;
}
解法二:
int operation2(vector<int> A, int index, int aim, vector<vector<int>> &map) {
    int result = 0;
    if (index == A.size()) {
        result = aim == 0 ? 1 : 0;
    } else {
        int mapValue = 0;
        for (int i = 0; i * A[index] <= aim; i++) {
            mapValue = map[index + 1][aim - i * A[index]];
            if (mapValue == -1) {
                result += operation2(A, index + 1, aim - i * A[index], map);
            } else {
                result += mapValue;
            }
        }
    }
    map[index][aim] = result;
    return result;
}
解法三:
int operation3(vector<int> A, int aim, vector<vector<int>> &dp) {
    // 初始化DP矩阵的第一列
    for (int i = 0; i < A.size(); i++) {
        dp[i][0] = 1;
    }
    // 初始化DP矩阵的第一行
    for (int i = 0; i <= aim; i++) {
        if (i % A[0] == 0) {
            dp[0][i] = 1;
        }
    }
    // DP过程
    for (int i = 1; i < A.size(); i++) {
        for (int j = 1; j <= aim; j++) {
            if (j >= A[i]) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - A[i]];
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    return dp[A.size() - 1][aim];
}
上一篇下一篇

猜你喜欢

热点阅读