找零钱

作者: 郑明明 | 来源:发表于2017-08-28 18:27 被阅读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];
}

相关文章

  • 背包问题详解

    目录 问题引入 在介绍背包问题之前,我们先来看一个小问题:找零钱问题。 找零钱问题 背包问题的一个浅显版本是找零钱...

  • 【找零钱】

    用python写一个找零钱的算法。 零钱共有50块,20块,10块,5块,和1块,共5种。。例:69 = 50 +...

  • 找零钱

    10人以上 如:男生1元,女生0.5元 围城一圈,中间站一人 主持人:“大家都来找零钱” 大家问:“找多少?” 主...

  • 找零钱

    给定一个数组,数组中为不同的数代表不同钱的面值,同时给定一个需要兑换零钱的钱数,任意使用不同面值不同数量的钱来兑换...

  • 算法思想之动态规划(三)——找零钱问题

    前言 今天我们继续讨论经典的动态规划问题之找零钱问题。 找零钱问题 问题描述 假设你是一名超市收银员,现有种不同面...

  • 找零钱问题

    问题 这个题目要求编写一段程序实现统一银座超市的找零方案。只需输入要补给顾客的 金额,然后通过程序就可以计算出该金...

  • 零钱找零

    零钱找零问题,题目是这样的 例如: 解决这样的问题,可以使用到的方法有贪心算法、暴力递归或lookback、动态规...

  • 贪心--找零钱

    目录[https://www.jianshu.com/p/85e18c21317a] 题号[https://lee...

  • 找零的技巧(日更第107天)

    曾经帮亲戚家卖鞭炮的时候,说起了找零的话题,说要是找钱,先找零钱,在找整的,也许顾客没有等到你给他整钱,他就...

  • 涂鸦诗 ® 找零钱

    诗人简介: 80后自由诗人琉璃姬,也使用笔名瓶盖猫,嗜烟酒,摇滚乐,信仰佛教,生来勇敢,生来热泪盈眶 ! 诗观 :...

网友评论

    本文标题:找零钱

    本文链接:https://www.haomeiwen.com/subject/ukigdxtx.html