美文网首页
08 拼硬币(递归)

08 拼硬币(递归)

作者: _Mirage | 来源:发表于2020-07-23 20:36 被阅读0次

题目大意是任意给定一些面值的硬币,然后给定一个金额的数值,问最少用多少枚上述硬币可以拼出指定的金额。

例如,面值为1, 4, 5的三种硬币,拼出面值为13。
有多种拼法:
2枚5,3枚1;
3枚4,1枚1;
2枚4,1枚5(最少硬币)
....

我们就是要计算出任给金额所需要硬币数量最小值。

分析:
刚开始着实被题目难住了,看起来太吓人了,然后思考过筛法,思考过循环....等等。
反正卡了有一段时间。
后面才发现这其实就是很经典的一道状态转移的递归题目:

  1. 边界条件:
    n = 4 || 5, 直接返回1(只需要1枚4元或者5元硬币)
    n < 4,直接返回n(需要n枚1元硬币)

  2. 状态转移方程:
    f(n) 只可能从以下三种情况转移得到(三种情况是或者的关系):
    f(n - 1) + 1(加一枚1元硬币)
    f(n - 4) + 1(加一枚4元硬币)
    f(n - 5) + 1(加一枚5元硬币)

因为我们要求的是选出数量最少的硬币,那么我们仅仅需要在上述三种状态中选出数量最少的一种即可(因为后面都是加的1,仅仅是前面不同)

那么我们由上述分析可知:状态转移方程为:
f(n) = min(f(n - 1), f(n - 4), f(n - 5)) + 1

image.png

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;

const int MAX = 1e8;
int dp[MAX];

int get_solutions(int n) {
    if (n < 4) return n;
    if (n == 4 || n == 5) return 1;
    if (dp[n]) return dp[n];
    return dp[n] = min(min(
        get_solutions(n - 1), get_solutions(n - 4)), get_solutions(n - 5)) + 1;
}

void solve(int n) {
    int ans = get_solutions(n);
    printf("%d\n", ans);
}

int main(int argc, char const *argv[])
{
    int n;
    scanf("%d", &n);
    solve(n);

    return 0;
}
运行结果: image.png

相关文章

  • 08 拼硬币(递归)

    题目大意是任意给定一些面值的硬币,然后给定一个金额的数值,问最少用多少枚上述硬币可以拼出指定的金额。 例如,面值为...

  • 函数式编程思想

    换硬币问题 问题就是动态规划里面的换硬币问题。所以函数式编程的关键和动态规划问题一样:递归关系式。换硬币问题发现他...

  • 拼硬币-(字节跳动2018)

    题目:现有n1+n2种面值的硬币,其中前n1种为普通币,可以取任意枚,后n2种为纪念币,每种最多只能取一枚,每种硬...

  • 2020-04-22

    针对39题,想起来,爬楼梯问题,分硬币问题。想到了用 dfs 递归来解决。1、针对不允许重复,想到了单调栈,这里也...

  • 08、泛型递归与树的递归

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树的遍历

    先序递归: 非递归: 中序递归: 非递归: 后序递归: 非递归 层次遍历

  • 拼多多再升级,试水医药电商有戏吗?

    拼多多再升级,试水医药电商有戏吗? 2018年11月01日 08:30:24来源:网络资料整理 拼多多发迹的模式在...

  • kotlin学习之递归

    demo地址 kotlin字符串与数字数字与字符串转换 kotlin递归之阶乘 当传入参数5时的结果2020-08...

  • 二叉树的前序、中序、后序遍历(递归、非递归)

    二叉树 前序 递归: 非递归: 中序 递归: 非递归: 层序 递归: 非递归:

网友评论

      本文标题:08 拼硬币(递归)

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